【问题标题】:AJAX request doesn't send Cookies set from same domainAJAX 请求不发送从同一域设置的 Cookie
【发布时间】:2015-02-09 00:19:03
【问题描述】:

我正在开发一种用户跟踪系统,其工作原理如下:

1) 一位站长在他的网站中添加了一个js脚本:

<script src="http://example.com/in/tracking.js"></script>

2) 当用户加载页面时,javascript 请求会返回一个 cookie 作为响应:

Set-Cookie:trackid=c1d7fde9cf87a9501cea57cedde97998;Version=1;Comment=;Domain=example.com;Path=/;Max-Age=31556926

(它基本上是一个简单的 cookie,持续 1 年)

3) tracking.js 向同一个 example.com 域发出 POST XMLHttpRequest,并传递一些参数:

theAjaxRequest.open("POST","http://example.com/in",true);
theAjaxRequest.setRequestHeader("Content-type", "multipart/form-data");
theAjaxRequest.send(parameters);

4) example.com 的后端应该读取之前设置的“trackid”cookie,但是,相反,我没有收到请求的 cookie...通过 Chrome 检查器分析 POST 请求,我注意到没有 cookie传入请求标头(而 tracking.js 的第一个 GET 请求通过 Set-Cookie 正确设置了 cookie)。

怎么会?起初我认为这可能是与同源策略有关的问题;所以我在后端 Web 服务器上启用了 CORS 标头。没有结果。因此,我尝试在 example.com 同一域下的网站上加载 tracking.js(例如 web.example.com)。反正又没有结果……

我错过了什么吗?

【问题讨论】:

    标签: javascript ajax cookies xss same-origin-policy


    【解决方案1】:

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    var invocation = new XMLHttpRequest();
    var url = 'http://bar.other/resources/credentialed-content/';
    
    function callOtherDomain(){
      if(invocation) {
        invocation.open('GET', url, true);
        invocation.withCredentials = true;
        invocation.onreadystatechange = handler;
        invocation.send(); 
      }
    

    第 7 行显示了 XMLHttpRequest 上必须设置的标志,以便使用 Cookie 进行调用,即 withCredentials 布尔值。默认情况下,调用是在没有 Cookie 的情况下进行的。由于这是一个简单的 GET 请求,它没有被预检,但浏览器将拒绝任何没有 Access-Control-Allow-Credentials: true 标头的响应,并且不会使响应可用于调用 Web 内容。

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2021-10-22
      • 2012-10-08
      • 2015-12-21
      • 2013-03-31
      • 2020-06-30
      • 2019-02-11
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多