在ASP.NET MVC 1.0,有处理跨站请求伪造安全问题的新特点:
<%= Html.AntiForgeryToken() %>
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc
}
我发现在HTML表单生成的令牌不断变化的每一种新形式呈现的时间。
我想知道是如何产生这些令牌? 并使用一些软件来扫描这个站点时,将报告的另一个安全问题:会话固定。 为什么? 因为令牌不断改变,怎么能这个问题来了?
而且还有另外一个功能,那就是“盐”为antiForgeryToken
,但我真的知道这是什么用,甚至通过我们没有使用“盐”生成令牌,令牌将时刻都在变化,所以为什么有这样的功能?
在AntiForgeryToken信息的地段位置: http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/
这是为了防止跨站请求伪造(CSRF)。 这是非常标准的行为,点击“保存”透过一个形式,并在服务器上执行某些动作,即节省了用户的详细信息。 你怎么知道用户提交表单是,他们声称是用户? 在大多数情况下,你会使用一些饼干或基于Windows的身份验证。
如果攻击者引诱你到它提交同样的形式在一个小的隐藏IFRAME一个网站? 你的饼干得到完整的提交和服务器不会看到一个合法的请求的请求任何不同。 (例如Gmail已经发现: http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/ )
该防伪标记防止这种方式的攻击通过创建生成页面的额外的cookie标记每次。 令牌是无论在形式和饼干,如果表单和cookie的不匹配,我们有一个CSRF攻击(因为攻击者无法读取使用上述攻击的防伪标记)。
又是什么盐做的,从上面的文章:
盐是任意的字符串。 不同的盐值意味着不同的防伪标记将会产生。 这意味着,即使攻击者设法得到一个有效的令牌持有不知何故,他们无法在需要不同的盐值的应用程序的其他部分重用。
更新:如何生成的令牌? 下载源 ,并有一看AntiForgeryDataSerializer,AntiForgeryData类。
你已经问了几个无关的问题:
- 我不知道为什么你的安全软件报告“会话固定”。 尝试阅读随附报告的文档
- 该防伪标记:
这被用于(可能),以验证每个请求是有效的。 因此,考虑到有人试图提出一个链接的网页?x=1
,如果令牌是不是也通过了,请求将被拒绝。 此外,(可能)防止同一项目重复发帖。 如果你点击“后”的两倍,令牌可能会发生变化(每个请求),并且这种情况下,将通过类似被检测:
Session["nextToken"] = token;
WriteToken(token);
...
if( !Request["nextToken"] == Session["nextToken"] ){
...
}
// note: order in code is slightly different, you must take the token
// before regenerating it, obviously
我认为这个术语(攻击它保护)被称为“CSRF”(跨站请求伪造),这些天。