什么是防伪标记盐的用途?

时间:2009-09-10 00:04:21

标签: asp.net-mvc security csrf session-fixation

在ASP.NET MVC 1.0中,有一个用于处理跨站点请求伪造安全问题的新功能:

 <%= Html.AntiForgeryToken() %>
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
    // ... etc
}

我发现每次呈现新表单时,以html格式生成的令牌都会不断变化。

我想知道这些令牌是如何生成的?当使用某些软件扫描此站点时,它将报告另一个安全问题:会话已修复。为什么?由于令牌保持不变,这个问题怎么来?

还有另一个函数,即antiForgeryToken的“盐”,但我真的知道这用了什么,即使我们不使用“salt”来生成令牌,令牌也会改变所有的时间,为什么有这样的功能?

2 个答案:

答案 0 :(得分:20)

这里有很多关于AntiForgeryToken的信息:http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

这是为了防止跨站请求伪造(CSRF)。单击“保存”对表单进行汇总并在服务器上执行某些操作(即保存用户的详细信息)是非常标准的行为。您如何知道提交表单的用户是他们声称的用户?在大多数情况下,您会使用一些cookie或基于Windows的身份验证。

如果攻击者将您引诱到一个在隐藏的IFRAME中提交完全相同形式的网站,该怎么办?您的cookie完整提交,服务器看不到请求与合法请求有任何不同。 (正如gmail发现的那样:http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/

防伪令牌通过在每次生成页面时创建额外的Cookie令牌来防止这种形式的攻击。令牌都在表单和cookie中,如果表单和cookie不匹配,我们会有CSRF攻击(因为攻击者无法使用上述攻击读取防伪令牌)。

从上面的文章中盐的作用是什么:

  

Salt只是一个任意字符串。不同的盐值意味着将生成不同的防伪标记。这意味着即使攻击者设法以某种方式获得有效令牌,他们也无法在需要不同盐值的应用程序的其他部分重用它。

更新:如何生成令牌?下载source,看一下AntiForgeryDataSerializer,AntiForgeryData类。

答案 1 :(得分:1)

你问了一些不相关的问题:

  1. 我不知道为什么您的安全软件报告“会话已修复”。尝试阅读报告附带的文档
  2. 防伪标记:
  3. 这可用于(大概)验证每个请求是否有效。因此,请考虑有人尝试提供指向页面?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”(跨站请求伪造),这些日子。