MVC防伪标记重复使用了之前生成的标记

7

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

到目前为止,机制似乎运作良好,因为如果我没有在目标操作中提供令牌作为输入隐藏字段,并带有[ValidateAntiForgeryToken],则会像预期的那样引发错误。

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

我一直认为一旦生成了令牌,就不可能在多个请求中重复使用同一个令牌,我认为这是框架本身的安全漏洞。

如果有人可以提供更多见解,将不胜感激。

2个回答

5

AntiForgeryToken是基于会话的,因此每个用户都具有相同的令牌,但另一个用户将具有不同的令牌。这篇讨论可能对您有用:AntiForgeryToken changes per request


Andrey,我有这种感觉,但是我怎么能做到以下操作。从HTML中获取几个AntiforgeryToken,关闭IIS Express,关闭浏览器,然后在启动项目后,我可以重复使用之前抓取的同一个ForgeryToken。 - jcgarciam

1
这是正常的行为,因为假定防伪令牌没有被破解。如果攻击者能够破解令牌,那就意味着攻击者已经有机会破解任何其他生成的令牌。例如中间人攻击。 因此,基本上不需要为每个请求生成防伪令牌,这将允许您在当前页面上使用已生成的令牌进行Ajax请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接