在我的所有表单都有@Html.AntiForgeryToken()
的基本MVC项目中,我见证了特定用户会话的所有表单的令牌(cookie)值始终相同。这是为什么?我部分理解(否则会出现很多问题,比如使用Back按钮)。但是为什么不使用“盐”使不同的形式不同:
“不推荐使用此方法。请改用AntiForgeryToken()方法。 要指定要嵌入到令牌中的自定义数据,请使用静态 AntiForgeryConfig.AdditionalDataProvider属性。“
为什么它如此巨大(在我的例子中,207个字节,用户身份名称是7个字符)?标准会话ID要短得多(41)。
答案 0 :(得分:3)
它只需要对用户会话是唯一的原因是由于漏洞利用的工作原理是针对CSRF漏洞的;
基本上,CSRF依赖于恶意用户提前设置的表单值。恶意用户只能设置表单值,通常作为GET参数;他们无法获取/读取合法表单上可能存在的值,并且他们无法可靠地为任何用户猜测207长度的代码。
如果存在XSS漏洞,恶意用户可以某种方式获取此“实时”信息,则会出现例外情况。但是,由于存在XSS漏洞,无论如何都没有必要使用CSRF。
因此,只要每个用户会话都有自己独特的值,恶意用户就不可能提前制作适当的表单提交。