2011-10-26 51 views
2

我已經開始在我的一些表單中使用AntiForgeryToken來防止跨站點請求僞造。然而,我收到了一些奇怪的行爲,只是想澄清這是一個錯誤還是隻是我做錯了什麼。我以我的形式使用Html.AntiForgeryToken()電話。然後,我在表單發佈到的操作方法中使用[ValidateAntiForgeryToken]屬性。此時我不使用鹽。AntiForgeryToken和ValidateAntiForgeryToken的意外行爲

我的理解是,Html.AntiForgeryToken()會生成一個名稱爲__RequestVerificationToken的隱藏輸入和一個名爲__RequestVerificationToken_Lw__的cookie,它們都應該包含相同的值。

但是我遇到的問題是:

  1. 該Cookie始終具有相同的價值,不管你 多少次讓頁面
  2. 隱藏輸入每次得到的時間有不同的價值頁面
  3. ValidateAntiForgeryToken每次都會驗證,即使是在CSRF方案中的 不同站點。
  4. 如果我更改了國外網站的隱藏輸入的值時, 令牌不驗證(預期的行爲,但爲什麼它驗證 當隱藏的輸入/ cookie的值是不同的?)

任何人有任何想法?

+0

好了,剛剛發現http://stackoverflow.com/questions/7186253/why-is-antiforgerytokens-hidden-field-not-same-as-它的cookie在我的機器上,它聲明它們的序列化不同,因此它們看起來包含不同的值。但是這並不能解釋爲什麼我的cookie值永遠不會改變(直到我刪除它並在我重新獲取頁面時生成一個新的),但輸入值確實發生了變化,或者爲什麼它總是驗證。 – coalvilledave

+0

此行爲似乎只發生在安全請求中。 – coalvilledave

回答

2

對於數字3,您是否在CSRF場景中包含隱藏字段?

AntiForgeryToken的安全性是隱藏的輸入僅存在於您的域所服務的頁面中,並且不能被其他域複製或捕獲。如果你嘲笑了通過隱藏輸入的測試,那麼這不是一個有效的測試。

我建議你閱讀這篇文章從菲爾哈克:Anatomy of a Cross-site Request Forgery Attack

+0

當我在CSRF站點中原封不動地提交代碼(帶有隱藏表單字段),然後提交表單時,它總是在服務器上進行驗證。很顯然,如果代碼不存在,它不會按照預期進行驗證。仍然不知道爲什麼cookies的價值保持不變。 – coalvilledave