2010-09-08 240 views
27

我試圖從CSRF保護一個應用程序(PHP和大量的JS)。反CSRF令牌和Javascript

我想使用令牌。

很多操作用AJAX做,所以我必須通過JavaScript中的令牌。 如果我想爲每個會話或每頁加載生成1個令牌,那麼很簡單 - 我生成新的令牌,將它放在DOM中的某個位置,然後用Javascript找到併發送給處理端。

但是,如果我想使用新的令牌每個操作呢? 我在考慮做一個ajax調用重新生成令牌,然後將結果傳遞給處理頁面。

這會增加安全風險嗎? 我在想引誘用戶到頁面的腳本,它會詢問令牌,然後用它來發出請求,但是再次跨域Javascript是禁止的。 可以用閃光燈完成嗎?

也許對於保護Ajax調用從CSRF另一種方法?

謝謝!

回答

27

有幾種技術,它們一起使用時可提供足夠的CSRF保護。

唯一令牌

一個單一的,特定的會話令牌是對於大多數應用足夠好。只要確保您的網站沒有任何XSS漏洞,否則您使用的任何類型的令牌技術都是浪費。

AJAX調用來重新生成令牌是一個壞主意。誰會守衛衛兵?如果AJAX調用本身容易受到CSRF的影響,那麼這種做法有失於目的。帶有AJAX的多個令牌通常是個壞主意。它迫使你序列化你的請求,即一次只允許一個AJAX請求。如果你願意忍受這個限制,你可以爲第二個AJAX調用搭載標記來響應第一個請求。

就個人而言,我覺得這是更好地重新認證爲關鍵事務的用戶,並保護剩下的交易與特定會話令牌。

自定義HTTP標頭

您可以自定義HTTP標頭添加到您的每一個請求,並檢查它在服務器端存在。實際的密鑰/值不需要保密,服務器只需確保它存在於傳入請求中。

這種方法是不夠好,保護CSRF在瀏覽器的新版本,但它可能工作過,解決此,如果您的用戶對Flash Player的舊版本。

檢查引薦

檢查網址標頭也很好地保護CSRF在新的瀏覽器。它不可能欺騙這個頭文件,儘管在老版本的Flash中是可能的。所以,雖然它不是萬無一失,但它仍然增加了一些保護。

解決驗證碼

強制用戶解決驗證碼也是針對CSRF有效。它不方便,但非常有效。即使您有XSS漏洞,這也許是唯一可以起作用的CSRF保護。

摘要

  1. 使用基於會話令牌,但對於高價值交易
  2. 重新認證添加自定義HTTP頭,並且也檢查引用。兩者都不是自己的萬無一失,但不要傷害
+0

添加一個自定義http標題困擾我,我敢肯定,你可以僞造自定義http標題與閃光和發射一個請求到另一臺服務器,只要標題元素不在黑名單中。我查看了近期對閃存的更改(在過去3個月內),並且他們修復了控制「跨站點文件上傳」攻擊所需的整個POST段的能力。除此之外,我認爲它的好信息,我給你+1。 – rook 2010-09-08 19:13:26

+0

是的,這裏是黑名單,當然引用者是不允許的,但從字面上看,其他的都是。 http://kb2.adobe.com/cps/403/kb403030.html – rook 2010-09-08 19:15:18

+1

@The Rook - Re。添加自定義標題 - 請參閱http://www.adobe.com/devnet/flashplayer/articles/flash_player_10_security.pdf。具體來說,請參閱標題爲「標題發送權限」的部分。我引用'當SWF文件希望將自定義HTTP標頭髮送到其自己的主機以外的任何位置時,發送請求的HTTP服務器上必須有一個策略文件。記住http://stackoverflow.com/questions/2609834/gwt-rpc-does-it-do-enough-to-protect-against-csrf?這就是我瞭解這個事實的難處。 – 2010-09-08 19:25:47