Чи специфічний порт кукі HTTP?


355

У мене на одній машині працюють два сервіси HTTP. Мені просто хочеться дізнатися, чи вони діляться файлами cookie чи розрізняє браузер між двома розетками сервера.

Відповіді:


329

Поточна специфікація файлів cookie - RFC 6265 , яка замінює RFC 2109 та RFC 2965 (обидва RFC тепер позначені як "Історичні") та формалізує синтаксис для використання файлів cookie в реальному світі. У ньому чітко зазначено:

  1. Вступ

...

З історичних причин файли cookie містять низку порушень безпеки та конфіденційності. Наприклад, сервер може вказати, що певний файл cookie призначений для "захищених" з'єднань, але атрибут Secure не забезпечує цілісності в присутності активного мережевого зловмисника. Аналогічно, файли cookie для даного хоста поділяються у всіх портах цього хоста, навіть якщо звичайна "політика того самого походження", яка використовується веб-браузерами, виділяє вміст, отриманий через різні порти.

А також:

8.5. Слабка конфіденційність

Файли cookie не забезпечують ізоляції по порту . Якщо файл cookie читається службою, що працює на одному порту, файл cookie також читається службою, що працює на іншому порту того ж сервера. Якщо файл cookie можна записувати службою на одному порту, файл cookie також може бути записаний службою, що працює на іншому порту того ж сервера. З цієї причини, сервери НЕ повинні обидва запускати послуги, що взаємно недовіряють, на різних портах одного хоста і використовують файли cookie для зберігання інформації, що стосується безпеки.


129

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

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

Тому, здається, не покладатися на будь-яку чітко визначену поведінку тут.


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

5
IE 9 навіть не надсилатиме файли cookie на наступні запити, якщо домен має порт у ньому
axk

3
Чи є браузер, який все ще розглядає порт у SOP-файлах файлів cookie?
Бертуз

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
Девід Балажич

53
Крім того, ви можете використовувати 127.0.0.1, 127.0.0.2, 127.0.0.3 тощо ... всі вони означають localhost.
Девід Балажич

3
Я не можу підтвердити це, оскільки це не відповідає на питання, але це чудова порада, дякую!
Мартін Т.

2
Якщо ви готові редагувати файл хостів (/ etc / hosts в Unix), ви можете мати стільки значущих імен, скільки вам подобається для localhost.
Silas S. Brown

20

Це велика сіра зона у cookie SOP (однакова політика щодо оригіналу).

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

Кращий підхід - отримати 2 доменних імені для одного і того ж IP-адреси і не покладатися на номери портів для файлів cookie.


9
Це вже не сіра зона. RFC 6265 , що є поточним стандартом cookie, усуває будь-яку плутанину щодо нього, просто усуваючи можливість розділяти куки на одному хості за допомогою різних портів.
Ремі Лебо

18

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

  • mysession8080 для сервера, який працює на порт 8080
  • mysession8000 для сервера, що працює на порту 8000

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

Майте на увазі, що ваша програма отримає обидва файли cookie, і вам потрібно подати запит на той, який відповідає вашому порту.

У назві файлу cookie не потрібно мати точний номер порту, але це зручніше.

Загалом, ім'я файлу cookie може кодувати будь-який інший параметр, характерний для використовуваного вами екземпляра сервера, тому його можна декодувати правильним контекстом.


9

У IE 8 файли cookie (перевірені лише щодо localhost) поділяються між портами. У FF 10 їх немає.

Я опублікував цю відповідь, щоб читачі мали принаймні один конкретний варіант для тестування кожного сценарію.


4

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

Я запускав їх із цими командами:

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

Коли я робив логін у першому, а потім у другому, я завжди виходив із першого та viceversa.

Я додав це до свого / 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) і третій, не торкаючись файлів хостів.
Тревіс Уотсон

1
Ви можете поставити його в один рядок:::1 app1 app2 app3 app4 app5 appN
аерозон

0

Це необов’язково.

Порт може бути визначений, щоб файли cookie могли бути специфічними для порта. Це не обов'язково, веб-сервер / програма повинні дбати про це.

Джерело: стаття німецької Вікіпедії , RFC2109 , глава 4.3.1


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.