2013-02-02 62 views
4

我知道如何確保上傳圖片Bypassing forms input fields to upload unwanted files我想給出另一個來自2個字段的例子,其中一個隱藏。隱藏字段輸入表格如何保護它

SQL表(ID,姓名,約旦第納爾,數量)

CREATE TABLE `users` (
    `id` bigint(20) unsigned NOT NULL auto_increment, 
    `name` varchar(255) default '0', 
    `job` varchar(255) default NULL, 
    `number` varchar(255) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

表單代碼(支撐構件可以編輯自己的信息)

<form action="send.php" method="post" name="send" id="send"> 
<input type="text" name="name" id="name" value="John"/> 
<input type="text" name="job" id="job" value="Plumber"/> 
<input type=hidden name="number" id="number" value="1234"/> 
<input type="Submit" name="Submit" value="Submit"/> 
</form> 

後來有一個Firefox擴展,可以繞過不同的輸入到服務器端的旁路檢查,並可能會造成很大的損害,所以在這裏它可以停止整個過程並使您能夠編輯隱藏表的值number到任何如value="1"導致成員更新信息有value number 1

enter image description here

該擴展工作如下,它可以僞造輸入數據之前,它傳遞到服務器端。

enter image description here

PHP代碼Send.php

if(isset($_POST['send'])){ 

$name = mysql_real_escape_string($_POST[name]); 
$job = mysql_real_escape_string($_POST[job]); 
$number = mysql_real_escape_string($_POST[number]); 

$sql= "update users SET name='$name',job='$job' WHERE number='$number'"; 
     mysql_query($sql) or die("query failed: $sql".mysql_error()); 

echo "Update Done"; 

} else { 
echo "Nothing to update"; 
} 

問題 那麼,如何保護這樣的輸入形式這種簡單的形式? 〜感謝

這個問題真的好痛因爲它使我的網站上免費給砍死:)

+1

而不是綁定他們的數字,使用一個UNIQUE ID,如PHP的SESSION ID? – hjpotter92

+1

您正在使用[an **過時的**數據庫API](http://stackoverflow.com/q/12859942/19068)並應使用[現代替換](http://php.net/manual/en/ mysqlinfo.api.choosing.php)。 – Quentin

回答

1

你無法控制哪些數據用戶提交對您的服務器。

您必須在服務器上檢查用戶是否有權查看信息或進行他們要求的更改。

例如:

能夠隱藏表數的值編輯到任何諸如值=「1」構件使更新信息具有值號碼1.

的方法會是這樣的:

  1. 是否允許任何人編輯此字段?如果是這樣,那麼確定。
  2. 請求是否來自經過身份驗證的用戶?如果沒有,則返回錯誤消息和登錄表
  3. 請求是否來自id = 1的用戶?如果是,那麼確定
  4. 如果請求來自擁有管理員權限的用戶?如果是這樣,那麼確定
  5. 返回錯誤消息。
1

如果你有一個窗體和任何用戶來編輯值,這個問題將在那裏。更好的方法是驗證用戶。只允許使用帳戶登錄的用戶對其各自的帳戶進行更改。

此外,不要使用mysql_query或任何類似mysql_ *,它們是不安全的,並在php5中折舊。

2

如果用戶授權是不是在你的事業的一個選項,你可以嘗試以下方法:

  • 設置隱藏字段以及其他一些信息
  • 設置隱藏醃製數的散列(可能的鹽會增加安全性)

當然,它會在發送表單HTML和驗證發佈信息時添加額外的步驟,但至少對於攻擊者來說更難以僞造一個va蓋子上的號碼。儘管如果攻擊者知道不同用戶的加密/散列號碼,除非明智地使用帶隱藏字段的鹽信息,否則它不會節省您的時間。