2012-08-24 71 views
-1

在最強烈的CSRF保護之間,存在表單令牌保護。我關於這個方法的問題是關於可用性:如果用戶打開包含表單的多個頁面(使用該表單),則會生成多個表單,但只有最後打開的頁面才能成功發送表單,所有其他表單都會發生錯誤。CSRF保護和可用性

我想2個解決方案:

  1. 保持一個獨特的令牌會話的所有時間。
  2. 在會話中存儲所有生成的令牌。

但是:

  1. 這是比較現實的解決方案,但安全性較差。
  2. 這會產生很大的資源開銷,因爲用戶可能會打開很多頁面,並且我必須存儲所有生成的令牌。

因此,您是如何解決這個問題的?

PS我正在開發的網站實際上是PHP中的電子商務,儘管匯款將通過外部提供商(如paypal)進行管理,但我認爲正確的做法是爲我的服務提供安全保障。

回答

2

您不需要在數據庫中存儲令牌。

相反,您應該在cookie中包含相同的標記;跨站點攻擊者無法讀取或設置cookie。
只要您在Cookie中獲得與發佈表單相同的標記,就很安全。

爲了獲得額外的安全性,您可以使用鍵控HMAC散列對它們進行散列,然後驗證該散列以確保令牌來自您的服務器。
您也可以製作每個用戶的令牌。

+0

謝謝SLaks的答案。令牌已存儲在用戶會話中(但我將會話數據存儲在數據庫中)。令牌是隨機生成的字符串,因此實際上無法計算。因此,HMAC Hash的效用是什麼? 保持一個唯一的每個用戶令牌,比每個表單顯示的令牌安全,您不覺得嗎? 「你也可以讓每個用戶的令牌」這個思想確立,否則安全性在哪裏? – Eghes

+1

@Eghes:散列不會很好,但不會造成任何傷害。按用戶來說,我的意思是在令牌中包含一個用戶ID(散列以防止交換),這樣即使攻擊者可以讀取或寫入令牌,他仍然需要獲取該ID。 (這可以更好地使用單獨的ID或GUID,而不用於其他任何內容) – SLaks

+0

好的,謝謝。但是,最後,您是否建議爲所有用戶會話使用單個令牌? – Eghes