【问题标题】:runtime loading of ValidateAntiForgeryToken Salt valueValidateAntiForgeryToken 盐值的运行时加载
【发布时间】:2011-02-28 23:43:33
【问题描述】:

考虑使用[ValidateAntiForgeryToken] 指令中的Salt 参数的 ASP.NET MVC 应用程序。

该应用程序将被许多客户使用。在编译时知道Salt 并不是非常可取的。

目前的策略是在 web.config 中定位 Salt 值。

[ValidateAntiForgeryToken(Salt = Config.AppSalt)]
//Config.AppSalt is a static property that reads the web.config.

这会导致编译时异常,提示 Salt 在编译时必须是 const。

属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式

如何修改应用程序以允许在运行时加载 Salt,从而不必为每个客户重新加盐和重新编译应用程序?

考虑到Salt 不会经常更改(如果有的话),从而消除了表单无效的可能性

【问题讨论】:

  • 正如 Microsoft MVC 安全人员 Levi 所说,您不需要这样做。

标签: asp.net-mvc csrf salt


【解决方案1】:

Salt 属性是编译时常量。它只是一种将特定表单链接到特定操作方法的方法。例如,如果您有一个登录表单,您可能希望对此表单使用盐“登录”,以便对登录表单有效的令牌不能用于更改密码表单等。

在所有情况下,应用程序的机器密钥都会自动用作附加盐值。因此,一个应用程序的反 XSRF 令牌不能用于另一个应用程序,即使两个盐值都读取“登录”。机器密钥可在 Web.config <machineKey> 部分中设置。

【讨论】:

  • 如果我有一个登录表单,我根本不需要防伪保护,是吗?因为用户尚未通过身份验证,并且没有任何保护措施。
  • 如果您不保护登录表单,您可能会打开登录 CSRF。有关更多信息,请参阅en.wikipedia.org/wiki/CSRF#Forging_login_requests。 (编辑:'Salt' 属性已从 MVC 4 中删除,因为大多数应用程序不需要它。如果您正在使用它,请参阅文档以获取更多信息。)
  • 谢谢,很有趣。但是根据文章,只有在Flash(crossdomain.xml)的上下文中才有可能,常规站点不受影响?
  • 登录 CSRF 不需要 Flash。包含 crossdomain.xml 文件将阻止基于 Flash 的攻击(这就是为什么它位于“对策”标题下),但攻击者仍然可以使用普通 Javascript 执行常规 CSRF(和登录 CSRF)攻击。
  • 对不起,我不明白。 CSRF 是“一种对网站的恶意利用,未经授权的命令从网站信任的用户传输”。要获得信任,用户必须经过身份验证。您能否分享一个链接,其中详细描述了对常规登录/密码表单的攻击?
【解决方案2】:

我需要为不同的客户提供不同的盐。在这种情况下,我使用了Dixin的解决方案,用于在运行时注入盐。

Anti Forgery Request Recipes For ASP.NET MVC and AJAX 在标题为“在运行时指定非常量盐”部分。

用新属性装饰你的控制器:

[ValidateAntiForgeryTokenWrapper(HttpVerbs.Post)]
public class ProductController : Controller
{     
    // Only HTTP POST requests are validated.
}

这个新属性定义为:

public class ValidateAntiForgeryTokenWrapperAttribute : FilterAttribute, IAuthorizationFilter
{
    public ValidateAntiForgeryTokenWrapperAttribute(HttpVerbs verbs)
    {
        this._verbs = new AcceptVerbsAttribute(verbs);
        this._validator = new ValidateAntiForgeryTokenAttribute()
            {
                //load from web.config or anywhere else
                Salt = Configurations.AntiForgeryTokenSalt
            };
    }

    // Other members.
}

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2018-03-11
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多