在Chrome中使用JavaScript POST将自定义Cookie发送到另一个域

时间:2018-11-07 19:43:29

标签: javascript jquery google-chrome cookies cors

我想将POST请求中的自定义Cookie从本地主机发送到另一个域(我的域)

我通过document.cookie =“ test = test”设置了cookie; 并且我可以通过console.log(document.cookie)正确看到它的设置,现在当我使用以下代码时,cookie不会被发送。

  $.ajax({
        url: 'https://secure.domain.com',
        type: 'POST',
        data: "hi",
        cache: false,
        contentType: false,
        processData: false,
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true
    });

我什至通过运行以下命令来禁用Chrome安全性

 -args --disable-web-security --user-data-dir 

仅发送以下标头

Accept: */*
Content-Type: text/plain;charset=UTF-8
Origin: http://localhost:8888
Referer: http://localhost:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.30 Safari/537.36

注意:这仅供我个人使用,因此我可以禁用chrome安全性或修改任何内容以供我使用。

2 个答案:

答案 0 :(得分:1)

此行为取决于客户端-在Chrome的情况下,Cookie标头与XMLHttpRequest一起使用时被禁止,并且似乎不能被任何命令行标志覆盖。

看看Chromium源代码,this是负责它的片段:

// "5. Terminate these steps if |name| is a forbidden header name."
// No script (privileged or not) can set unsafe headers.
if (FetchUtils::IsForbiddenHeaderName(name)) {
  LogConsoleError(GetExecutionContext(),
                  "Refused to set unsafe header \"" + name + "\"");
  return;
}

每当您使用Cookie作为header参数调用XMLHttpRequest.setRequestHeader(header, value)时,都会调用此方法,这就是jQuery $.ajax({})在后​​台使用的方式。

有关某些客户端为何可能禁用此行为的更多信息,请参见this answer

Here是禁止的标头名称的完整列表:

ForbiddenHeaderNames::ForbiddenHeaderNames()
    : proxy_header_prefix_("proxy-"), sec_header_prefix_("sec-") {
  fixed_names_ = {
      "accept-charset",
      "accept-encoding",
      "access-control-request-headers",
      "access-control-request-method",
      "connection",
      "content-length",
      "cookie",
      "cookie2",
      "date",
      "dnt",
      "expect",
      "host",
      "keep-alive",
      "origin",
      "referer",
      "te",
      "trailer",
      "transfer-encoding",
      "upgrade",
      "user-agent",
      "via",
  };
}

答案 1 :(得分:1)

修改铬源代码不是一个好主意,对于此任务,您只需创建扩展即可修改请求标头,而无需参数-disable-web-security

创建名称为headers_ext的文件夹并添加以下文件

manifest.json

{
  "manifest_version": 2,
  "name": "Modify Request Headers",
  "version": "1.0",
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "<all_urls>",
    "tabs",
    "webNavigation"
  ],
  "background": {
    "scripts": ["background.js"]
  }
}

backround.js

function modifyRequestHeaders(request) {
  for (var headers = request.requestHeaders, i = 0; i < headers.length; ++i) {
    if (headers[i].name.toLowerCase() == 'accept') {
      // set Cookie from 'Accept' header value
      headers.push({"name" : "Cookie", "value" : headers[i].value});
      // normalize 'Accept' header value
      headers[i].value = '*/*';
    }
  }
  return {requestHeaders: headers};
}

function modifyResponseHeaders(response) {
  for (var headers = response.responseHeaders, i = 0; i < headers.length; ++i) {
    if (headers[i].name.toLowerCase() == 'access-control-allow-origin') {
      headers.splice(i, 1);
      break;
    }
  }

  // Allow cross domain
  headers.push({"name": "Access-Control-Allow-Origin", "value": "*"});
  return {responseHeaders: headers};
}

var webRequestOptions = {urls: ["<all_urls>"], types: ["xmlhttprequest"]};

chrome.webRequest.onBeforeSendHeaders.addListener(modifyRequestHeaders,
  webRequestOptions, ["blocking", "requestHeaders", 'extraHeaders']);
chrome.webRequest.onHeadersReceived.addListener(modifyResponseHeaders,
  webRequestOptions, ["blocking", "responseHeaders"]);

现在,在Chrome扩展程序页面中,点击Load unpacked extension并找到目录。

以上扩展名将仅修改xmlhttprequest请求标头,并将Accept标头值用作Cookie的值,并且还通过添加标头{{1}来修改响应标头以允许跨域请求}。

对于Chrome来说,Access-Control-Allow-Origin: *标头似乎尚未列入安全列表,因此我使用DPR, Downlink, Save-Data, Viewport-Width, Width标头来避免AcceptPreflight的请求,因为许多网站都没有不支持这一点。并且OPTIONS被过滤以允许修改或创建extraHeaders

有关CORS的更多信息,请阅读here

确保您使用的是最新的Chrome浏览器,并创建这样的请求

Cookie