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

问题描述 投票:3回答:2

我想在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安全性或修改任何内容供我使用。

javascript jquery google-chrome cookies cross-domain
2个回答
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;
}

[只要您将XMLHttpRequest.setRequestHeader(header, value)作为XMLHttpRequest.setRequestHeader(header, value)参数调用Cookie,就会调用此方法,这就是jQuery的header在幕后使用的。

有关为什么某些客户端可能禁用此行为的更多信息,请参见$.ajax({})

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

Here

1
投票

修改铬源代码是一个坏主意,对于此任务,您只需创建扩展即可修改请求标头,而无需参数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", }; }

使用-disable-web-security之类的名称创建文件夹并添加以下文件

manifest.json

headers_ext

backround.js

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

现在,在Chrome扩展页面中,单击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"]); 并找到目录。

上述扩展名将仅修改Load unpacked extension请求标头,并将xmlhttprequest标头值用作Accept值,它还通过添加标头Cookie来修改响应标头以允许跨域请求。

对于Chrome,似乎Access-Control-Allow-Origin: *标头尚未列入安全列表,所以我改用DPR, Downlink, Save-Data, Viewport-Width, Width标头来避免AcceptOPTIONS请求,因为许多网站不支持此标头。并且Preflight是过滤器,允许修改或创建Preflight

有关更多CORS信息,请阅读extraHeaders

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

Cookie
© www.soinside.com 2019 - 2024. All rights reserved.