2012-08-25 101 views
1

在PHP中再次保護CSRF攻擊的最佳方法是什麼?在PHP中防止CSRF攻擊的最佳方法

建議使用表單標記,因此基本上會生成一個隨機值並將其存儲在隱藏字段中。然後將這個隨機值存儲在用戶會話中。

最後在表單動作中,確保會話和表單令牌匹配。

if($_SESSION['token'] !== $_POST['token']) { 
    die("bad... spanking..."); 
} 

是否有更好/更簡單的方法,因爲這需要在我的應用程序(大量的表單和操作)中進行大量的代碼修改。

+2

使用CSRF預防令牌是要走的路。 – PeeHaa

回答

2

不可以。爲了防止CSRF,您需要確保只有在您有理由相信用戶實際提交表單時,纔會信任自動附加到請求(如cookie)的憑據。唯一的方法就是讓表單攜帶服務器用來授權處理的某種祕密。

如果您使用框架或庫來組成表單,它可能會幫助您生成隨機數,設置cookie或會話屬性以及向表單添加隱藏的輸入,但這三個步驟確實需要發生。

+0

檢查'referer'是什麼? – Justin

+1

http://www.cgisecurity.com/csrf-faq.html#referer說不:「首先有很多方法可以將Referer頭部空白或修改,例如通過網頁過濾軟件,家長控制軟件,隱私軟件,代理服務器或者DOM技巧,這使得referer頭部本質上不可靠 第二個Referer頭文件可以使用XMLHTTP和Amit Klein和rapid7演示的flash來僞造,雖然這些特定的方法已經被廠商修補,用戶訪問您的網站已經應用了這些補丁,即使他們確實存在第一個問題。「 –

+0

好的,我應該在每個頁面上重新生成一個新的'token'嗎?因此,每次重新加載都會生成一個新的令牌,將其存儲在會話中,並將其設置在隱藏字段中? – Justin