目前我正在研究ASP .NET MVC 4应用程序。我们使用提供的[ValidateAntiForgeryToken]
和相应的@Html.AntiForgeryToken()
在我们的表单中生成隐藏字段,这些字段是使用POST提交的。
到目前为止,该机制似乎正常工作,因为如果我没有将令牌作为输入隐藏字段提供给使用[ValidateAntiForgeryToken]
注释的目标操作,则会按预期引发错误。
然而,我发现非常奇怪,如果我使用Firebug或Chrome检查器捕获了几个生成的令牌,将它们复制到记事本然后转到另一个页面,该页面也使用AntiForgeryToken并基本上用之前生成的任何令牌替换隐藏字段,不会引发错误。我期望总是有一个1:1的关系(Page Hidden Field - ValidationAtServer),因为如果有人能够获得该值,将能够在应用程序中伪造任何需要AntiForgeryToken的任何形式的请求
我的印象是,一旦生成令牌,就不可能重复使用相同的令牌,我认为这是框架本身的安全漏洞。
如果有人能提供更多的见解,将会非常感激。
答案 0 :(得分:5)
AntiForgeryToken是会话库,因此每个用户具有相同的令牌,但另一个用户将具有不同的令牌。这种震荡可能对您有用:AntiForgeryToken changes per request
答案 1 :(得分:1)
这是正常的行为,因为它假设防伪令牌没有受到损害。如果atacker能够妥协令牌,那意味着atacker已经有机会妥协任何其他的tokes,那将会产生。例如。中间人攻击的人。 因此,基本上不需要为每个请求创建Antiforgery令牌,并且它允许您在当前页面上使用已经生成的令牌来进行Ajax请求。