Asp.net-Mvc

有什麼理由不信任 ASP.NET AntiForgeryToken?

  • May 29, 2013

我知道 Stack Exchange 站點不使用內置的 ASP.NET MVC`@Html.AntiForgeryToken()來防止 XSRF/CSRF 攻擊。*Stack Exchange 方法不是根據 web.config 的machineKey*部分創建一個以非常長的值__RequestVerificationToken命名*的*fkey`隱藏輸入,而是創建一個以更簡潔的值命名的輸入。這顯然是一個 Guid,並且基於來自Google Code 上 Stack Exchange Data Explorer 項目的證據,該值與每個單獨的使用者相關聯,在您登錄或註銷之前保持相當穩定。

此外,Stack Exchange 值在頁面上是恆定的,並且可供客戶端腳本使用,因此用於投票的 Ajax 文章和類似的事情也使用令牌。相比之下

那麼為什麼 Stack Exchange 會向自己的鼓手進軍呢?

  • 有理由不信任 AntiForgeryToken 嗎?
  • AntiForgeryToken 是否有一些 Stack Exchange 團隊不願意接受的限制?如果有,它們是什麼?
  • 或者,當 Stack Overflow 啟動時,AntiForgeryToken 只是不存在(它在 MVC Futures 項目中開始存在),如果他們今天從頭開始,他們會使用 AntiForgeryToken?

我一直無法在 Stack Exchange 團隊中找到 Jeff 或其他人的任何部落格文章來解釋 SE 網路上 XSRF 預防策略背後的指導原則。如果他們中的一個人可以寫一篇文章,那將是非常好的,當然假設它可以在不產生漏洞的情況下籠統地完成。對於我們這些想要確保我們的網站安全但又不完全放心只是盲目地相信微軟會為我們做這件事的人來說,這將是非常有價值的資訊。

我們在預設實現中遇到的一個限制是缺乏對 AJAX 呼叫的開箱即用支持。隱藏欄位方法適用於主要處理傳統表單 POST 的網站;但是,對於像 SO 這樣的 AJAX 繁重的網站來說,情況並非如此。

我們實施了這篇CodeThinked 部落格文章中概述的方法,我們非常高興。根據他2011 年 10 月的部落格文章,看起來 Phil Haack 也支持這種方法

幾個(不請自來的,我知道!)指針:

  1. 如果你正在執行一個網路農場,你當然應該在你的 Web.config 中使用靜態機器密鑰
  2. 確保您的所有伺服器都安裝了此 KB。否則,您可能會遇到機器密鑰驗證問題

引用自:https://stackoverflow.com/questions/9896011