跨站点请求伪造和安全审核

时间:2018-10-23 12:13:51

标签: jquery asp.net-mvc security cookies antiforgerytoken

我将尝试描述一种情况。 我有一个MVC项目,该项目已从要使用该项目的公司进行了安全审核。 他们遇到的问题是他们使用适当的帐户合法登录到站点并获得2个cookie(.ASPXAUTH和ASP.NET_SessionId)

接下来,他们寻找我对用jquery调用的方法的调用之一。基本上,API链接到POST方法。

接下来,他们复制合法令牌并创建一个JS文件,并在同一台PC上(可能是在同一浏览器上)调用我的方法,并且该方法可以正常工作,并且它们像在Jquery调用中一样发布一些内容。

现在他们告诉我这不好,我应该添加一个防伪令牌。好的,到目前为止。

因此,我在项目中的每个Razor页面上都添加了防伪令牌,例如@Html.AntiForgeryToken(),而且我找到了一种在每个ajax请求中添加令牌的方法:

$(document).ready(function () {
  $.ajaxSetup({
    beforeSend: function (xhr) {
      xhr.setRequestHeader("__RequestVerificationToken",  $('input[name=__RequestVerificationToken]').val());
    }
  });
});

在MVC方面,我像这样检查它:

public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
  public void OnAuthorization(AuthorizationContext filterContext)
  {
    if (filterContext == null)
    {
      throw new ArgumentNullException("filterContext");
    }

    var httpContext = filterContext.HttpContext;
    var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
    var token = httpContext.Request.Headers["__RequestVerificationToken"];
    if (token == null)
      token = "";

    AntiForgery.Validate(cookie != null ? cookie.Value : null, token);
  }
}

在我要检查的所有方法/控制器上,我添加了[ValidateHeaderAntiForgeryToken],效果很好。没有令牌,没有玩耍。简单又好。

因此,我很高兴进行更新,并要求他们再次进行测试。

他们做同样的事情,登录,转到调用我的POST API方法的页面,并复制所有cookie(现在又复制一个),然后再次运行其脚本即可。

通常情况下,由于该站点是通过HTTPS进行的,因此他们无法获取任何Cookie。

那么,有什么办法可以防止这种情况发生?还是他们的要求可笑?因为如果要删除其用户,他们将根本不会获得任何cookie或令牌。

在此先感谢您的帮助。

0 个答案:

没有答案