Asp.net-Mvc
為什麼@Html.AntiForgeryToken() 在同一個響應中生成不同的令牌?
單個 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 攻擊的可以看這裡。