Udostępnij plik cookie między subdomeną i domeną

Mam dwa pytania. Rozumiem, że jeśli podam domenę jako .mydomain.com (z kropką wiodącą) w pliku cookie, Wszystkie subdomeny mogą udostępniać plik cookie.

Czy subdomain.mydomain.com może uzyskać dostęp do pliku cookie utworzonego w mydomain.com (bez subdomeny www)?

Czy mydomain.com (bez subdomeny www) może uzyskać dostęp do pliku cookie, jeśli został utworzony w subdomain.mydomain.com?

Author: adam0101, 2013-08-28

7 answers

2 domeny mydomain.com i subdomain.mydomain.com mogą udostępniać pliki cookie tylko wtedy, gdy domena jest jawnie nazwana w nagłówku Set-Cookie. W przeciwnym razie zakres plików cookie jest ograniczony do hosta żądania. (Jest to określane jako "plik cookie tylko dla hosta". Zobacz Co to jest plik cookie tylko dla hosta?)

Na przykład, jeśli wysłałeś następujący nagłówek z subdomain.mydomain.com, to plik cookie nie zostanie wysłany dla żądań do mydomain.com:

Set-Cookie: name=value

Jednak jeśli użyjesz poniższego, będzie on użyteczny na obu domeny:

Set-Cookie: name=value; domain=mydomain.com
Ten plik cookie zostanie wysłany do dowolnej subdomeny mydomain.com, w tym zagnieżdżone subdomeny, takie jak subsub.subdomain.mydomain.com.

W RFC 2109 , domena bez wiodącej kropki oznaczała, że nie może być używana na subdomenach, a tylko wiodąca kropka (.mydomain.com) pozwoliłaby na użycie jej w wielu subdomenach (ale nie w domenie najwyższego poziomu, więc to, o co prosisz, nie było możliwe w starszej specyfikacji).

Jednak wszystkie nowoczesne przeglądarki szanują nowszą specyfikację RFC 6265 , i zignoruje każdą wiodącą kropkę, co oznacza, że możesz używać pliku cookie na subdomenach, a także w domenie najwyższego poziomu.

Podsumowując, jeśli ustawisz plik cookie jak w drugim przykładzie powyżej z mydomain.com, będzie on dostępny przez subdomain.mydomain.com i odwrotnie. Może to być również wykorzystane do umożliwienia sub1.mydomain.com i sub2.mydomain.com udostępniania plików cookie.

Zobacz też:

 779
Author: cmbuckley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-30 07:04:14

Nie jestem pewien, czy odpowiedź @ cmbuckley pokazuje pełny obraz. To co czytam to:

O ile atrybuty pliku cookie nie wskazują inaczej, plik cookie jest zwracane tylko do serwera origin (a nie np. do jakiegokolwiek subdomeny), a wygasa po zakończeniu bieżącej sesji (jako zdefiniowane przez agenta użytkownika). Agenci użytkownika ignorują nierozpoznane pliki cookie.

RFC 6265

Również

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Dla mnie oznacza to, że możesz Chroń pliki cookie przed czytaniem przez subdomenę/domenę, ale nie możesz zapobiec zapisywaniu plików cookie do innych domen. Więc ktoś może przepisać pliki cookie Twojej witryny, kontrolując inną subdomenę odwiedzaną przez tę samą przeglądarkę. Co może nie być wielkim zmartwieniem.

Awesome cookies test site provided by @ cmbuckley / for those that missed it in his answer like me; worth scrolling up and upvoting/:

 41
Author: akostadinov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 13:27:15

Proszę pamiętać, że można ustawić plik cookie z subdomeny na domenie.

(wysłana w odpowiedzi na zapytanie subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Ale nie możesz ustawić pliku cookie z domeny na subdomenie.

(wysłana w odpowiedzi na zapytanie mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie
Dlaczego ?

Zgodnie ze specyfikacją RFC 6265 sekcja 5.3.6 model pamięci

Jeśli kanoniczny request-host Nie domain-match atrybut domain -: Ignoruj plik cookie całkowicie i przerwij te kroki.

I RFC 6265 sekcja 5.1.3 dopasowanie domeny

Dopasowanie Domeny

A string domain-dopasowuje dany łańcuch domeny, jeśli posiada co najmniej jeden z następujących warunków:

  1. Łańcuch domeny i łańcuch są identyczne. (Zauważ, że zarówno ciąg domenowy i ciąg będzie kanoniczny do małe litery w tym momencie.)

  2. Wszystkie następujące warunki:

    • Łańcuch domeny jest sufiksem łańcucha.

    • Ostatni znak łańcucha, który nie jest zawarty w łańcuch domeny to %x2E (".").

    • Łańcuch jest nazwą hosta (tzn. nie adresem IP).

Więc "subdomain.mydomain.com" domeny-mecze "mydomain.com", ale " mydomain.com" nie pasuje do domeny "subdomain.mydomain.com"

Sprawdź tę odpowiedź również.

 39
Author: Accountant م,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-05 10:17:23

Oto przykład użycia DOM cookie API ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), więc możemy zobaczyć na własne oczy zachowanie.

Jeśli wykonamy następujący JavaScript:

Dokument.cookie = "klucz = wartość"

Wygląda na to samo co wykonanie:

Dokument.cookie = "klucz = wartość;domain=mydomain.com"

Klucz cookie staje się dostępny (tylko) w domenie mydomain.com .


Teraz, jeśli wykonasz następujący JavaScript na mydomain.com:

Dokument.cookie = "klucz = wartość;domain=.mydomain.com"

Klucz cookie staje się Dostępny dla mydomain.com jak również subdomain.mydomain.com .


Wreszcie, jeśli spróbujesz wykonać następujące czynności na subdomain.mydomain.com:

Dokument.plotdata = "klucz=wartość;domain=.mydomain.com"

Czy klucz cookie staje się Dostępny dla subdomain.mydomain.com ? byłem nieco zaskoczony, że jest to dozwolone; założyłem, że byłoby to naruszenie bezpieczeństwa dla subdomeny, aby móc ustawić plik cookie na domenie nadrzędnej.

 24
Author: lammy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 20:52:27

Bądź ostrożny, jeśli pracujesz na localhost ! Jeśli przechowujesz plik cookie w js w ten sposób:

document.cookie = "key=value;domain=localhost"

Może nie być dostępna dla Twojej subdomeny, jak sub.localhost. Aby rozwiązać ten problem, musisz użyć Virtual Host . Dla exemple można skonfigurować swój wirtualny host z ServerName localhost.com Następnie będziesz mógł przechowywać plik cookie na swojej domenie i subdomenie w następujący sposób:

document.cookie = "key=value;domain=localhost.com"
 4
Author: Alexandre97122,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-16 20:29:15

W obu przypadkach tak może, i jest to domyślne zachowanie zarówno dla IE, jak i Edge.

Inne odpowiedzi dodają cennego wglądu, ale głównie opisują zachowanie w Chrome. ważne jest, aby pamiętać, że zachowanie jest zupełnie inne W IE. Bardzo pomocny skrypt testowy CMBuckley pokazuje, że w (powiedzmy) Chrome Pliki cookie nie są współdzielone między rootem i subdomenami, gdy nie podano domeny. Jednak ten sam test w IE pokazuje, że są one współdzielone. Ten przypadek IE jest bliższy opis take-home w linku www-or-not-www. Wiem, że tak jest, ponieważ mamy system, który używał różnych plików cookie servicestack zarówno na głównej, jak i subdomenie. Wszystko działało dobrze, dopóki ktoś nie dostał się do niego w IE i oba systemy walczyły o to, czyje ciasteczko sesji wygra, dopóki nie wysadziliśmy pamięci podręcznej.

 3
Author: DannyW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-06 05:57:42

Proste rozwiązanie

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);
5. parametr Setcookie określa (pod)domeny, dla których plik cookie jest dostępny. Ustawianie go na (EXAMPLE.COM) udostępnia ją dowolnej subdomenie (np.: SUBDOMAIN.EXAMPLE.COM )

Odniesienie: http://php.net/manual/en/function.setcookie.php

 -11
Author: Lawes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 11:28:09