Определен ли порт файлов cookie HTTP?


355

У меня есть две HTTP-службы, работающие на одной машине. Я просто хочу знать, разделяют ли они свои куки или браузер различает два серверных сокета.

Ответы:


329

Текущей спецификацией cookie является RFC 6265 , которая заменяет RFC 2109 и RFC 2965 (оба RFC теперь помечены как «Исторические») и формализует синтаксис для использования файлов cookie в реальном мире. В нем четко говорится:

  1. Введение

...

По историческим причинам куки-файлы содержат ряд нарушений безопасности и конфиденциальности. Например, сервер может указать, что данный файл cookie предназначен для «безопасных» соединений, но атрибут Secure не обеспечивает целостность в присутствии активного сетевого злоумышленника. Точно так же файлы cookie для данного хоста совместно используются всеми портами на этом хосте, хотя обычная «политика одного и того же источника», используемая веб-браузерами, изолирует контент, извлекаемый через разные порты.

А также:

8,5. Слабая конфиденциальность

Файлы cookie не обеспечивают изоляцию по порту . Если файл cookie доступен для чтения службой, работающей на одном порту, файл cookie также может быть прочитан службой, работающей на другом порту того же сервера. Если файл cookie доступен для записи службой на одном порту, файл cookie также доступен для записи службой, работающей на другом порту того же сервера. По этой причине серверам НЕ СЛЕДУЕТ запускать службы, не доверяющие друг другу, на разных портах одного и того же хоста и использовать файлы cookie для хранения конфиденциальной информации.


129

В соответствии с RFC2965 3.3.1 (за которым могут или не могут следовать браузеры), если порт явно не указан в portпараметре Set-Cookieзаголовка, куки могут отправляться или не отправляться на любой порт.

В Руководстве по безопасности браузера Google говорится: по умолчанию область действия cookie ограничивается всеми URL-адресами текущего имени хоста и не привязана к информации о порте или протоколе. и несколько строк позже. Нет возможности ограничить файлы cookie только одним DNS-именем, [...] аналогично, нет способа ограничить их определенным портом. (Кроме того , имейте в виду, что IE делает число не фактор порта в его же происхождения политики вообще .)

Так что, похоже, здесь нельзя полагаться на какое-либо четко определенное поведение.


75
RFC 6265 , который заменяет RFC 2965, исключает Portпараметр в Set-Cookieзаголовке (потому что практически никто не использовал его на практике) и очень четко указывает, что файлы cookie на одном хосте больше НЕ различимы по портам.
Реми Лебо

5
IE 9 даже не отправит cookie-
файлы

3
Есть ли какой-либо браузер, который все еще рассматривает порт в СОП своих куки?
Бертуз

5
Chrome даже не установит cookie, если в нем есть порт.
Пим Хейден

76

Это действительно старый вопрос, но я решил добавить обходной путь, который использовал.

У меня на ноутбуке работают две службы (одна на порту 3000, а другая на 4000). Когда я переключался между ( http://localhost:3000и http://localhost:4000), Chrome передавал один и тот же cookie, каждый сервис не понимал cookie и генерировал новый.

Я обнаружил, что если я получу доступ http://localhost:3000и http://127.0.0.1:4000, проблема исчезнет, ​​так как Chrome сохранит cookie для localhost и один для 127.0.0.1.

Опять же, никто не может заботиться об этом, но это было легко и полезно для моей ситуации.


1
Да, поскольку файлы cookie связаны с именами хостов / доменов, поэтому файл cookie localhostне может использоваться совместно 127.0.0.1и наоборот. Но куки-файлы на одном хосте / домене, независимо от порта, являются разделяемыми.
Реми Лебо

3
Конечно они делают. Я (и, вероятно, миллион других разработчиков) постоянно использую localhost для тестирования. Если добавленный порт не имеет значения: localhost: 8080
David Balažic

53
Также вы можете использовать 127.0.0.1, 127.0.0.2, 127.0.0.3 и т. Д., Все они означают localhost.
Давид Балажич

3
Я не могу сказать это, потому что это не отвечает на вопрос, но это отличный совет, спасибо!
Мартин Т.

2
Если вы хотите отредактировать файл hosts (/ etc / hosts в Unix), вы можете иметь столько значимых имен, сколько вам нужно для localhost.
Сайлас С. Браун

20

Это большая серая область в SOP cookie (Политика одинакового происхождения).

Теоретически, вы можете указать номер порта в домене, и куки не будут разделены. На практике это не работает с несколькими браузерами, и вы столкнетесь с другими проблемами. Так что это возможно только в том случае, если ваши сайты не предназначены для широкой публики, и вы можете контролировать, какие браузеры использовать.

Лучший подход состоит в том, чтобы получить 2 доменных имени для одного и того же IP и не полагаться на номера портов для файлов cookie.


9
Это больше не серая зона. RFC 6265 , который является текущим стандартом файлов cookie, устраняет любые недоразумения, просто устраняя возможность разделения файлов cookie на одном хосте с использованием разных портов.
Реми Лебо

18

Альтернативный способ обойти проблему - сделать так, чтобы имя файла cookie сеанса было связано с портом. Например:

  • mysession8080 для сервера, работающего на порте 8080
  • mysession8000 для сервера, работающего на порту 8000

Ваш код может получить доступ к конфигурации веб-сервера, чтобы выяснить, какой порт использует ваш сервер, и соответствующим образом назвать cookie.

Имейте в виду, что ваше приложение получит оба куки, и вам нужно запросить тот, который соответствует вашему порту.

Нет необходимости указывать точный номер порта в имени файла cookie, но это более удобно.

Как правило, имя файла cookie может кодировать любой другой параметр, специфичный для используемого вами экземпляра сервера, поэтому его можно декодировать в правильном контексте.


9

В IE 8 файлы cookie (проверяются только на локальном хосте) распределяются между портами. В FF 10 их нет.

Я опубликовал этот ответ, чтобы у читателей был хотя бы один конкретный вариант для тестирования каждого сценария.


4

У меня была похожая проблема при запуске (и попытке отладки) двух разных приложений Django на одной машине.

Я запускал их с этими командами:

./manage.py runserver 8000
./manage.py runserver 8001

Когда я входил в первый, а затем во второй, я всегда выходил из первого и наоборот.

Я добавил это в мой / etc / hosts

127.0.0.1    app1
127.0.0.1    app2

Затем я запустил два приложения с помощью этих команд:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

Задача решена :)


4
Вы, вероятно, можете использовать 127.0.0.1:8000для одного, localhost:8000для секунды, и, возможно ::1:8000(возможно [::1]:8080) для третьего, даже не трогая файл hosts.
Трэвис Уотсон

1
Вы можете поместить это в одну строку:::1 app1 app2 app3 app4 app5 appN
аэрозон

0

Это необязательно.

Порт может быть указан, поэтому куки могут быть привязаны к конкретному порту. Это не обязательно, веб-сервер / приложение должно заботиться об этом.

Источник: статья в немецкой Википедии , RFC2109 , глава 4.3.1.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.