Asp.net

MVC 2 AntiForgeryToken - 為什麼是對稱加密 + IPrinciple?

  • March 12, 2015

我們最近更新了我們的 MVC 2 解決方案,這更新了AntiForgeryToken工作方式。不幸的是,這不再適合我們的 AJAX 框架。

問題是 MVC 2 現在使用對稱加密來編碼關於使用者的一些屬性,包括使用者的Name屬性(來自IPrincipal)。我們能夠使用 AJAX 安全地註冊新使用者,之後後續的 AJAX 呼叫將無效,因為當使用者被授予新的委託人時,防偽令牌將發生變化。還有其他情況可能會發生這種情況,例如使用者更新其姓名等。

我的主要問題是為什麼 MVC 2 甚至會費心使用對稱加密?那麼它為什麼要關心主體上的使用者名屬性呢?

如果我的理解是正確的,那麼任何隨機共享的秘密都可以。基本原則是使用者將收到一個帶有一些特定數據的cookie(HttpOnly!)。然後需要這個 cookie 來匹配每個可能有副作用的請求(通常是 POST)發回的表單變數。由於這只是為了防止跨站點攻擊,因此很容易製作一個可以輕鬆通過測試的響應,但前提是您可以完全訪問 cookie。由於跨站點攻擊者無法訪問您的使用者 cookie,因此您受到保護。

通過使用對稱加密,檢查 cookie 的內容有什麼好處?也就是說,如果我已經發送了一個 HttpOnly cookie,那麼攻擊者就無法覆蓋它(除非瀏覽器存在重大安全問題),那麼為什麼我還需要再次檢查它呢?

在考慮之後,它似乎是那些“增加安全層”的案例之一——但如果你的第一道防線已經下降(HttpOnly),那麼攻擊者無論如何都會越過第二層,因為他們有完全的訪問權限到使用者的 cookie 集合,並且可以直接模擬他們,而不是使用間接 XSS/CSRF 攻擊。

當然,我可能遺漏了一個主要問題,但我還沒有找到它。如果這裡有一些明顯或微妙的問題,那麼我想知道它們。

添加它是為了在您有一個子域試圖攻擊另一個子域的情況下提供更大的保護 - bad.example.com 試圖攻擊 good.example.com。添加使用者名使 bad.example.com 更難在幕後聯繫 good.example.com 並嘗試讓它代表您生成令牌。

展望未來,cookie 可能會被刪除,因為它對於系統的正常執行並不是絕對必要的。(例如,如果您使用表單身份驗證,則該cookie 可以用作反 XSRF cookie,而不是要求系統生成第二個 cookie。)例如,該 cookie 可能僅在匿名使用者的情況下發布。

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