2011-11-21 60 views
3

我GOOGLE了這兩天提交形式,我只是找不到任何描述了以下問題:如何防止從本地主機到服務器

比方說,我對「www.example以下表格。 COM「:

<form action="formProcessor.htm" method="post"> 
    <input name="field1" value="abc" /> 
    <input name="field2" value="123" /> 
    <input name="field3" value="etc" type="hidden" /> 
    <input value="Submit" type="submit" /> 
</form> 

我擔心的是:如果某人有什麼創建一個本地文件模擬這種形式,在所有的值手動填寫,然後提交給‘www.example.com/formProcessor’?

問題1:有什麼辦法可以防止這種情況發生嗎?

問題2:這是否被認爲是所謂的CSRF?

我知道你可以嘗試驗證REFERRER,但我也知道這可以很容易僞造(只需查找「修改頭文件」FF附加組件)。

如果這是一個基本問題,請耐心等待我,我對網站安全性相當陌生。

馬克

回答

4

是的,這是Cross-site Request Forgery

你可以阻止它通過創建一個一次性密鑰,並存儲在一個隱藏的輸入元素在你的形式是這樣的:

<?php 

$_SESSION['formkey'] = md5(rand() . time() . $_SERVER['REMOTE_ADDR']); 

... 

<input type="hidden" name="formkey" value="$_SESSION['formkey']" /> 

?> 

而且一旦提交,您檢查提交的關鍵字是否匹配你在會話中存儲的一個。如果是這樣,你處理表單,否則拒絕請求。

攻擊者(或通過攻擊者網站訪問的無辜訪問者)不會知道密鑰,因此無法提交表單。

只有來自您網站的訪問者可以在其中重新生成並在每個表單上設置正確的密鑰,然後才能提交。

1

使用以下/表單頁面上相似(PHP):

session_start(); 
if (empty($_SESSION['formkey'])) { 
$_SESSION['formkey'] = time() . "-" . getmypid() . "-" . rand(0, mt_getrandmax()); 
} 

設置您的形式隱藏的表單字段:

<input type="hidden" name="formkey" value="<?php echo $_SESSION['formkey']; ?>" /> 

,然後處理/處理器頁:

if ($_SESSION['formkey'] !== $_POST['formkey']) { 
header("Location: formpage.php?blankfields"); 
exit(); 
} 

我試圖從遠程服務器發佈,並按預期失敗。 討厭這些垃圾郵件發送者機器人,不知道他們試圖通過垃圾郵件形式達到什麼目的?

相關問題