ASP.NET MVC ValidateAntiForgeryToken - 它可以用授权检查和引用检查替换吗?

Mik*_*huk 3 security asp.net-mvc csrf

在ASP.NET MVC中,有一个ValidateAntiForgeryToken属性,可以实现跨站点脚本防御.

是否有可能用这种机制取而代之

  • 授权检查,包括检查被操纵的资源属于当前用户;
  • 引用者检查,禁止外部主机的AJAX Web api请求;
  • 禁止在iframe中托管的网站?

Sil*_*Fox 9

这不会阻止跨站点脚本,只能跨站点请求伪造.

授权检查,包括检查被操纵的资源属于当前用户;

不,因为资源确实属于当前用户,所以只有当前用户不愿意做出的请求.

例如,在您的网站上说www.foo.com您有以下URL将删除用户的帐户.

www.foo.com/DeleteAccount

您的用户已登录www.foo.com.现在说出您的用户访问www.evil.com,其中包括页面上的以下图片代码.

<img src="http://www.foo.com/DeleteAccount" />

这将向您的页面发出请求并删除用户的帐户,因为DeleteAccount资源将通过cookie检查授权并确定用户确实已获得授权,因为auth cookie随请求一起提供.

引用者检查,禁止外部主机的AJAX Web api请求;

是的,这是一个有效的检查,虽然它比你的问题中提到的使用Anti Forgery Token的方法弱.

OWASP CSRF小抄状态

尽管在您自己的浏览器上欺骗引用标头是微不足道的,但在CSRF攻击中不可能这样做.检查引用程序是防止嵌入式网络设备上的CSRF的常用方法,因为它不需要每用户状态.当内存稀缺时,这使得引用者成为CSRF预防的有用方法.这种CSRF缓解方法也常用于未经身份验证的请求,例如在建立会话状态之前进行的请求,该会话状态是跟踪同步令牌所必需的.

但是,从CSRF保护来看,检查引用者被认为是较弱的.例如,开放重定向漏洞可用于利用受引用检查保护的基于GET的请求.应该注意的是,GET请求永远不会发生状态更改,因为这违反了HTTP规范.引用检查也存在常见的实现错误.例如,如果CSRF攻击源自HTTPS域,则将省略引用者.在这种情况下,当请求执行状态更改时,缺少引用程序应被视为攻击.另请注意,攻击者对引用者的影响有限.例如,如果受害者的域名是"site.com",则攻击者的CSRF漏洞源自"site.com.attacker.com",这可能会欺骗破坏的引用者检查实施.XSS可用于绕过引用者检查.

另请注意,有时引用并不总是传递,因为用户可能正在使用删除标头的隐私软件.

禁止在iframe中托管的网站?

这可以是您托管在其他站点上的小部件的有效防御.

例如,www.bar.com可以通过使用script标签在您的页面上包含您的小部件:

<script src="//www.foo.com/widget.js"></script>
Run Code Online (Sandbox Code Playgroud)

为了防止www.bar.com在您的小部件中提交表单,您的JavaScript代码会将document.writeIFrame放入页面,然后在其中包含您的内容.该同源策略会阻止从父页面读取和你的表不能再由包括您的插件的网站提交IFrame的内容.但是,在这里您可能需要一个手动确认窗口,以便在任何点击的情况下弹出以防止点击顶升攻击(例如,如果您有一个like按钮(类似于Facebook)并且您想要防止虚假likes来自包含页面自动提交您的表单).

OWASP推荐标准

OWASP建议是使用同步标记模式是通过ASP.NET MVC与实施的一个ValidateAntiForgeryToken.