Отправка пользовательских файлов cookie на другой домен с помощью JavaScript POST в Chrome - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу отправить пользовательский файл cookie в POST-запросе на другой домен (мой домен) с localhost

Я установил cookie по document.cookie = "test = test"; и я могу видеть его набор правильно по 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 голосов
/ 08 февраля 2019

модифицировать исходный код хрома - плохая идея, для этой задачи вы можете просто создать расширение для изменения заголовков запроса, без аргумента -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, а также изменять заголовок ответа, чтобы разрешить междоменный запрос, добавив заголовокAccess-Control-Allow-Origin: *.

Для Chrome кажется, что заголовки DPR, Downlink, Save-Data, Viewport-Width, Width еще не находятся в безопасном списке, поэтому вместо них я использую заголовок Accept, чтобы избежать запроса OPTIONS или Preflight, поскольку многие веб-сайтыне поддерживает этоИ extraHeaders - это фильтр, позволяющий изменять или создавать Cookie.

. Для получения дополнительной информации о CORS прочитайте здесь

. Убедитесь, что вы используете последнюю версию Chrome, и создайте запрос.как это

$.ajax({
  url: 'https://example.com',
  type: 'POST', // or GET or HEAD
  headers: {
    // it will used for 'Cookie' value by extension
    'Accept': "cookieName=cookieValue" 
  }
});
0 голосов
/ 07 ноября 2018

Это поведение зависит от клиента - в случае 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) с Cookie в качестве параметра header, и это то, что jQuery $.ajax({}) использует под капотом.

Для получения дополнительной информации о том, почему некоторые клиенты могут отключить это поведение, см. thisответ .

Здесь - полный список запрещенных имен заголовков:

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",
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...