Asp.net-Mvc

為什麼@Html.AntiForgeryToken() 在同一個響應中生成不同的令牌?

  • November 5, 2017

單個 Razor 視圖包含多個表單,每個表單都有自己的呼叫@Html.AntiForgeryToken()

<form id="f1">
   @Html.AntiForgeryToken()
</form>

<form id="f2">
   @Html.AntiForgeryToken()
</form>

據我了解,這兩個防偽令牌應該是相同的。

<form id="f1">
   <input name="__RequestVerificationToken" type="hidden" value="duVT4VtiYybun-61lnSY1ol__qBwawnELooyqT5OSrCJrvcHvDs_Nr9GLxNxwvBaI4hUcKZVkm6mDEmH2UqNorHD1FnJbKJQLWe8Su_dhy_nnGGl5GhqqC3yRGzcxbBM0" />
</form>

<form id="f2">
   <input name="__RequestVerificationToken" type="hidden" value="ZMISz3IWHU_HCKP4FppDQ5lvzoYhlQGhN1cmzKBPz4OgDzyqSUK3Q1dqvw1uHsb4eNyd9U3AbFcnW8tR7g1QS8Dyhp0tFc-ee1sfDAOqbLCcgd3PDnLCbXx09pnPREaq0" />
</form>

為什麼價值觀不同?

當然它們應該是相同的,因為它們是從伺服器以相同的響應發送的?文件
沒有 說明只呼叫一次。

恐怕這行不通。

防偽令牌也會在響應 cookie 中傳播,因此您的將只包含最後一個令牌,因此第一個表單將始終失敗。

你可以嘗試做這樣的事情:

@{
   ViewBag.Title = "Index";
   var token = Html.AntiForgeryToken();
}

<form id="f1">
   @token 
</form>

<form id="f2">
   @token 
</form>

我試過了,兩種形式都使用了同一個token。

必須不同。不是因為實現內部工作或 API 巫術,而是因為每個表單都代表對伺服器的獨立請求。

如果表單具有相同的令牌,一旦攻擊者知道一個表單的令牌值,他就能夠欺騙伺服器接受其他表單發送的數據,儘管它們不是由使用者送出的,從而破壞了由AntiCSRF 令牌。

令牌的目的是提供一個隨機的 id 參數,使攻擊者很難欺騙應用程序以為是登錄使用者填寫了表單。

不熟悉 CSRF 攻擊的可以看這裡

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