【问题标题】:Cookies not sent in ajax request headers when doing XSS with CORS (Access-Control-Allow-Origin) response header set设置 CORS(Access-Control-Allow-Origin)响应标头进行 XSS 时未在 ajax 请求标头中发送 Cookie
【发布时间】:2012-12-31 00:47:21
【问题描述】:

我似乎无法在我的浏览器上以 javascript 设置 cookie,以作为 jQuery ajax 请求的一部分发送到子域 Web 应用程序。

我有两个 Web 应用程序,一个在根域上,一个在子域上。为了绕过跨站点脚本限制,我的子域 Web 应用程序实现了一个全局操作过滤器,以将 Access-Control-Allow-Origin 标头添加到其所有 http 响应的根域。这允许从根域到子域的 ajax 调用工作。

但是,当我使用以下代码在 javascript 中创建 cookie 时...

var myDate = new Date();
myDate.setMonth(myDate.getMonth() + 12);
document.cookie = 'searchId=' + ids.generateGUID() + ';domain=' + ".root.example.com" + ';path=/;expires=' + myDate;

...在后续的ajax请求中不会将cookie传递给-sub域服务器。

我认为 CORS 标头和在 cookie 中设置域和路径将允许子域 Web 应用程序访问 cookie,但浏览器(chrome 21.0.1180.89 和 firefox 17.0.1)似乎不提供饼干。

我在使用子域和ajax请求时是否误解了浏览器cookie访问限制?

谢谢

【问题讨论】:

    标签: jquery asp.net-mvc cookies xss cors


    【解决方案1】:

    为了让 cookie 与 CORS 一起使用,您需要做两件事。

    首先,您的服务器需要响应以下标头:

    Access-Control-Allow-Credentials: true
    

    其次,你的XmlHttpRequest对象需要设置withCredentials属性:

    xhr.withCredentials = true;
    

    这应该在请求中发送远程域 cookie,尽管 cookie 必须由远程服务器设置。

    您的 JS 代码本身仍然无法访问 cookie,也无法在远程域上设置 cookie。没有办法,AFIAK for JS 代码访问另一个域的 cookie。

    【讨论】:

    • 谢谢@monsur。我尝试添加 'Access-Control-Allow-Credentials: true' 和 'xhr.withCredentials = true;'但是就像你在JS中添加cookie时所说的那样,它不起作用。我也尝试使用'XHR.setRequestHeader()' 设置它but this isn't supported。我还尝试在来自子域服务器的早期响应上设置 cookie,并设置了根域/路径/到期时间,但它不包含在后续请求中(这更令人困惑,因为我认为通过设置 cookie 可以允许这样做根域)
    • 无论如何,我正在通过将客户端上的 id 保存在 cookie 中并将其作为表单数据的一部分或适当的查询字符串发送回服务器来解决此问题。跨度>
    猜你喜欢
    • 2020-09-21
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2019-06-19
    • 2016-09-25
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多