【问题标题】:XSRF Cookies not being attached to request header over https iframe loaded over http siteXSRF Coo​​kie 未通过 http 站点加载的 https iframe 附加到请求标头
【发布时间】:2016-01-18 18:23:57
【问题描述】:

我最近在 MVC/angularjs 上实现了 XSRF。安全网站的加载方式有两种,一种是直接发布,另一种是 iframe。

下面是代码:- 角度

 .config(function ($httpProvider) {
           $httpProvider.defaults.xsrfCookieName = '@model.Handlers.XsrfHandler.COOKIE_HEADER_NAME';
           $httpProvider.defaults.xsrfHeaderName = '@model.Handlers.XsrfHandler.COOKIE_HEADER_NAME';
       })

MVC - 过滤器

public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        //TODO : Check the current value of the cookie if it exists
        if (request.HttpMethod != "GET")
        {
            base.OnResultExecuting(filterContext);
            return;
        }

        //TODO : SHA hash the cookie or something.
        var cookieValue = filterContext.HttpContext.Session.SessionID;

        if (!request.Cookies.AllKeys.Contains(AntiForgeryConfig.CookieName))
        {
            var cookie = new HttpCookie(XsrfHandler.COOKIE_HEADER_NAME, cookieValue) { HttpOnly = false };
            response.SetCookie(cookie);
        }
        else
        {
            response.Cookies[XsrfHandler.COOKIE_HEADER_NAME].Value = cookieValue;
        }

        base.OnResultExecuting(filterContext);
    }

MVC 处理程序

 protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (!xsrfMethods.Contains(request.Method.Method))
            return await base.SendAsync(request, cancellationToken);

        var cookie = request.Headers.GetCookies().SelectMany(chv => chv.Cookies).FirstOrDefault(cs => cs.Name == COOKIE_HEADER_NAME);

        if (cookie == null)
            return CreateError(request);

        var headerValue = request.Headers.GetValues(COOKIE_HEADER_NAME).FirstOrDefault();

        if (string.IsNullOrWhiteSpace(cookie.Value) || string.IsNullOrWhiteSpace(headerValue))
            return CreateError(request);

        if (headerValue.Trim().Equals(cookie.Value.Trim(), System.StringComparison.InvariantCulture))
            return await base.SendAsync(request, cancellationToken);

        return CreateError(request);
    }

现在我们有一个客户端正在 HTTP 站点上加载 HTTPS iframe(不知道为什么)。它在 chrome、firefox 中仍然可以正常工作,但在 IE 中失败。 XSRF 令牌似乎没有附加到 IE 的 POST 请求标头。

我的问题是,标题问题的解决方法是什么,而无需添加任何边缘案例逻辑。

【问题讨论】:

    标签: angularjs asp.net-mvc internet-explorer iframe csrf


    【解决方案1】:

    我只是愚蠢。在几个帖子中给出了答案。 只需为IE添加P3P协议即可。

    在 web.config 中添加了 P3P,瞧。

     <httpProtocol>
      <customHeaders>
        <add name="P3P" value="CP=&quot;IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT&quot;" />
      </customHeaders>
    </httpProtocol>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 2016-06-22
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2012-06-09
      相关资源
      最近更新 更多