2013-11-01 152 views
4

我試圖使用表單密鑰方法csrf protection這裏http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/。但它僅適用於頁面上的一個表格。我的問題是csrf的保護

假設我有一個形式

<form action="action.php" method="post"> 
<!-- code here --> 
</form> 

和我的PHP我使用

<?php 
if(isset($_POST['submit']) && isset($_SESSION['user'])) 
{ 
//do something 
} 

我已經使用session user確認他是否已登錄並和形式由我的網站提交,因爲會議已在我的網站上進行。我是否也必須使用csrf保護方法?

回答

4

我是否也必須使用csrf保護方法呢?

是的,因爲這正是爲什麼CSRF是危險的;當他們在另一個網站上提交修改後的表單時,「受害者」的cookie會在不知情的情況下發送給服務器,以便代表「黑客」執行特定操作,例如,由可愛的小貓照片僞裝(例如)。

當提交變相形式時,您的站點無法區分請求和合法請求,因爲身份驗證是有效的。添加CSRF令牌可確保表單是從網站上的頁面提交的。

創建會話時,您還會生成一個CSRF令牌。此令牌隨後將用於會話期間您網站上的所有表單;這樣做可以防止同時打開多個選項卡的問題。

即使表單從您的頁面複製(包括CSRF令牌),該令牌也將存儲在不屬於經過驗證的用戶的會話中。

+0

假設我使用會話方法,其中我生成一個表單鍵,並將密鑰發送到PHP驗證的地方。現在的問題是,如果在兩個選項卡中打開同一頁面,並且我刷新新頁面並關閉它。 '會話變量改變'。現在,當我提交第一個選項卡上的表單。它總是會出錯。有時候用戶會這樣'在2個選項卡中打開相同的頁面'。是否還有其他安全的csrf保護方法? – Ace

+3

@ user2894116 - 創建會話時生成令牌,而不是每次加載表單時都生成令牌。 – Quentin

+0

@Jack道歉! 。這個ajax方法需要很多代碼,因爲我的頁面上有很多表單。這裏用其他方式代碼少,安全性相同嗎? – Ace