2011-01-30 92 views
3

這是足以讓CSRF保護:這對於CSRF保護足夠了嗎?

  • 生成一個隨機字符串,$_SESSION['hash']並將其存儲
  • 隱藏值(以$_POST['thing'])的形式包含隨機字符串
  • 當提交表單時,它會檢查是否$_SESSION['hash']等於$_POST['thing'],並繼續它們是否匹配

我的一個網站的用戶不斷告訴我,我的網站是脆弱的,但我不能告訴我們,如果他只是在拖我。還有什麼我可以做的嗎?

+0

它可能取決於你改變隨機字符串的頻率;每個用戶都必須得到他們自己的,我建議定期輪換它,所以意外披露並不會造成太大的損害。 – sarnold 2011-01-30 02:05:06

+0

每次他們加載頁面時,如果它尚未設置,它會改變。 – 2011-01-30 02:11:38

回答

1

如果它'對每個用戶來說都是獨一無二的,那麼它應該就夠了。即使用戶會話持續時間相同,它仍然可以,但我建議定期重新生成它。 另外你可能想要爲每個表單使用不同的標記。例如,如果您有登錄表單和註釋表單,最好爲它們使用不同的標記,但它不是100%必需的。

爲什麼你認爲只是因爲有人說你的網站很脆弱,它與CSRF的連接有關?他們有很多其他可能的漏洞。

也許你的網絡服務器過時和脆弱,也許PHP版本不是最新的。也許用戶能夠通過ssh或telnet登錄到你的服務器。也許用戶能夠猜出管理員密碼。

也許讓人們通過cookie登錄並將登錄憑據存儲在cookie中。

除CSRF之外還有太多可以利用的東西。用戶也有可能是錯的,或者不知道他在說什麼,或者他只是想讓你緊張。

3

我認爲你缺少的是將標記限制在小窗口時間。

你應該看看Chris's CRSF-article。快速總結:

  • CSRF攻擊必須包括一個有效的令牌(反CSRF令牌),以便完美地模仿表單提交。
  • 令牌的有效性也可以限制在一小段時間內,如五分鐘
  • 如果您按照我的建議在您的所有表單中使用了一個令牌,則可以從您的關注列表中消除CSRF 。雖然沒有保障措施可以被認爲是絕對的(攻擊者理論上可以猜出有效的代幣),但這種方法可以減輕大部分風險。直到下個月,安全。
1

每次他們加載頁面時,它的變化,如果它不是已設置。

那麼這是你的問題。一旦令牌被取回,所有的動作都可以被輕鬆地進一步執行。我通常將令牌實施爲對一個請求有效,然後再生成它。