MVC AntiForgeryToken重用以前生成的令牌

时间:2013-08-11 18:28:57

标签: asp.net-mvc asp.net-mvc-4 xss cross-site

目前我正在研究ASP .NET MVC 4应用程序。我们使用提供的[ValidateAntiForgeryToken]和相应的@Html.AntiForgeryToken()在我们的表单中生成隐藏字段,这些字段是使用POST提交的。

到目前为止,该机制似乎正常工作,因为如果我没有将令牌作为输入隐藏字段提供给使用[ValidateAntiForgeryToken]注释的目标操作,则会按预期引发错误。

然而,我发现非常奇怪,如果我使用Firebug或Chrome检查器捕获了几个生成的令牌,将它们复制到记事本然后转到另一个页面,该页面也使用AntiForgeryToken并基本上用之前生成的任何令牌替换隐藏字段,不会引发错误。我期望总是有一个1:1的关系(Page Hidden Field - ValidationAtServer),因为如果有人能够获得该值,将能够在应用程序中伪造任何需要AntiForgeryToken的任何形式的请求

我的印象是,一旦生成令牌,就不可能重复使用相同的令牌,我认为这是框架本身的安全漏洞。

如果有人能提供更多的见解,将会非常感激。

2 个答案:

答案 0 :(得分:5)

AntiForgeryToken是会话库,因此每个用户具有相同的令牌,但另一个用户将具有不同的令牌。这种震荡可能对您有用:AntiForgeryToken changes per request

答案 1 :(得分:1)

这是正常的行为,因为它假设防伪令牌没有受到损害。如果atacker能够妥协令牌,那意味着atacker已经有机会妥协任何其他的tokes,那将会产生。例如。中间人攻击的人。  因此,基本上不需要为每个请求创建Antiforgery令牌,并且它允许您在当前页面上使用已经生成的令牌来进行Ajax请求。