2012-12-13 67 views
3

在基本的MVC項目中,我的所有表單都有@Html.AntiForgeryToken()我目睹了針對特定用戶會話的全部表單的令牌(cookie)值始終相同。這是爲什麼?我部分理解(否則會出現很多問題,例如使用「後退」按鈕)。但是,爲什麼不讓它使用「鹽」不同的形式不同:瞭解ASP.NET MVC防僞保護

「此方法已不使用AntiForgeryToken()方法,而不是 要指定自定義數據將被嵌入令牌內,使用靜態 。 AntiForgeryConfig.AdditionalDataProvider屬性「。

爲什麼它如此巨大(在我的例子中,207字節,用戶身份名稱是7個字符)?標準會話ID要短得多(41)。

+0

「AntiForgeryToken」不是隱藏表單的值嗎? –

+0

就是這樣。但生成的令牌存儲在cookie和隱藏字段中。在發佈時,它們的值必須與通過驗證的值相同。 – UserControl

+0

啊,對了;疑難雜症! –

回答

3

它只需要對用戶會話唯一的原因是由於攻擊如何工作以CSRF漏洞爲目標;

本質上,CSRF依賴於惡意用戶提前設置表單值。惡意用戶只能設置表單值,通常是GET參數;他們無法獲取/讀取合法表單上可能存在的值,並且他們無法可靠地爲任何用戶猜測長度爲207的代碼。

如果存在XSS漏洞,惡意用戶可能以某種方式獲取此「實時」信息,則會出現異常。但是,由於存在XSS漏洞,無論如何,幾乎沒有必要使用CSRF。

所以,只要每個用戶會話都有其獨特的價值,惡意用戶提前制定適當的表單提交實際上是不可能的。

+0

爲什麼'AntiForgeryToken()'重載鹽無論如何存在? – UserControl

+0

@UserControl我想只是爲了讓您添加獨特的功能,如果你想。我無法想象一種需要它的Web應用程序,但我想他們只是想允許這種可能性。或者也可能只是爲了增加令牌的隨機性。 –

+0

明白了!任何猜測的大小?爲什麼不只是通過會話ID散列? – UserControl