Установить Cookie с сервера на клиент XHR в другом домене, установив домен в домен клиента, должно ли это работать? - PullRequest
0 голосов
/ 20 февраля 2019

tl; dr, клиент XHR в домене A отправляет запрос на сервер в домене B, сервер отвечает Set-Cookie с Domain=A (домен клиента, XHR Origin),все заголовки CORS установлены правильно, должно ли это работать?

Хорошо известно, что нельзя установить cookie в другой домен.( Как установить cookie для другого домена

Однако с учетом следующего сценария:


Действующие лица:

Клиент в домене A , веб-клиент

Сервер в домене B , настройка с заголовками CORS, допускающими A в качестве источника, включая Access-Control-Allow-Credentials установлен на true

Поток связи 1 (базовый уровень):

  1. Клиент отправляет простой запрос GET на сервер
  2. Сервер отвечаетс cookie и устанавливает свойство Domain для сервера (Domain = B )
  3. Клиент отправляет еще один HXR-запрос и имеет withCredentials=true
  4. Cookieотправляется обратно на сервер без проблем

Примечание : файл cookie, отправленный на шаге 1, не отображается в document.cookies, даже если он не был установленкак httpOnly (так как он не принадлежит домену клиента). Также попытка получить его из xhr, посмотрев на заголовок «Set-Cookie», вы будетезаблокировано, по замыслу: https://fetch.spec.whatwg.org/#forbidden-response-header-name он даже не будет отображаться в инструментах Chrome dev на вкладке сети!но он все равно будет отправлен)

Поток связи 2 (мой вопрос):

  1. Клиент отправляет простой запрос GET на сервер
  2. Серверотвечает cookie, но устанавливает свойство Domain для клиента (Domain = A )
  3. Клиент отправляет запрос HXR и имеет withCredentials=true
  4. cookie не отправляется обратно и, похоже, нигде не хранится

Почему я немного удивлен?Так как XHR-источник A и запрашивает что-то, что устанавливает cookie в домен A (если я посмотрю в Postman, я отчетливо вижу, что заголовок Set-Cookie отправляется с Domainтакой же, как в запросе Origin), и у меня для этого есть наиболее допустимая настройка CORS, в чем причина того, что я не позволил это сделать?(Я ожидал, что он потерпит неудачу, но все же заставил меня задуматься)


Вопросы

  1. Где находится лучшее место в спецификации / RFC, где разъясняется, чтоэто не будет работать и для XHR, где cookie Domain равен Origin

  2. Каков вектор атаки в сценарии 2, если теоретически браузер сделал разрешить серверу сохранять cookie, если и только если Origin совпадает с cookie Domain, а источник CORS разрешает этот источник.

  3. Есть ли другой способ заставить его работать?Может быть, это работает, но мой POC был настроен неправильно?

Приложение: Reasoning

Я ищу способ использовать перекрестный источник CSRF, используя что-то вроде Cookie to header token метод , но из-за проблемы перекрестного происхождения кажется, что это невозможно.Единственный обходной путь, о котором я подумал, - это отправка токена CSRF в качестве заголовка с сервера, после чего клиент может просто сохранить его как файл cookie, к которому он может получить доступ позже, есть ли другой способ сделать это?Это считается безопасным?

1 Ответ

0 голосов
/ 20 февраля 2019

Ресурс может устанавливать файлы cookie только для регистрируемого домена своего хоста.Если бы Facebook использовал Google Fonts, и Google мог бы использовать это для переопределения файлов cookie Facebook, это было бы довольно катастрофично.

Что касается того, где это определено, шаги 5 и 6 из https://tools.ietf.org/html/rfc6265#section-5.3 обрабатываютэтот.(Fetch в значительной степени относится к этому RFC, когда дело доходит до интерпретации заголовка Set-Cookie в ответах.)

...