<%= Html.AntiForgeryToken() %> [ValidateAntiForgeryToken] public ViewResult SubmitUpdate() { // ... etc }
我发现以html形式生成的令牌每次呈现新的表单时都会保持更改.
我想知道这些令牌是如何生成的?而当使用某些软件扫描本网站时,会报告另一个安全问题:会话固定.为什么?由于令牌保持改变,这个问题怎么来了?
另外还有另一个功能,那就是antiForgeryToken的“salt”,但是我真的知道这是什么用的,即使我们不使用“salt”来生成令牌,令牌会一直改变,所以为什么这样的功能?
解决方法
这是为了防止跨站点请求伪造(CSRF).点击“保存”表单并在服务器上执行某些操作(即保存用户的详细信息)是非常标准的行为.您如何知道用户提交表单是他们声称的用户?在大多数情况下,您将使用一些基于cookie或Windows的认证.
如果攻击者引诱您到一个隐藏的IFRAME中提交完全相同格式的站点,该怎么办?您的Cookie完整提交,服务器看不到与请求合法的请求. (正如gmail发现:http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/)
防伪令牌通过在每次生成页面时创建一个附加的cookie标记来防止这种形式的攻击.令牌既是表单,也是cookie,如果表单和cookie不匹配,我们就会遇到一个CSRF攻击(攻击者无法使用上述攻击来读取防伪令牌).
从上面的文章,盐做什么呢?
Salt is just an arbitrary string. A different salt value means a different anti-forgery token will be generated. This means that even if an attacker manages to get hold of a valid token somehow,they can’t reuse it in other parts of the application where a different salt value is required.
更新:令牌如何生成?下载source,并查看AntiForgeryDataSerializer,AntiForgeryData类.