2013-08-28 11 views
228

Mam dwa pytania. Rozumiem, że jeśli określę domenę jako .mydomain.com (z wiodącą kropką) w pliku cookie, że wszystkie subdomeny mogą współużytkować plik cookie.Udostępnianie plików cookie między subdomenami i domeną

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

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

+2

Tak, możesz .. zobacz link poniżej http://www.codeguru.com/csharp/csharp/cs_internet/article.php/c19417/Sharing-Cookies-Across-Domains.htm –

+0

Ściśle związany: http: /stackoverflow.com/questions/3089199/can-subdomain-example-com-set-a-cookie-that-can-be-read-by-example-com –

+0

czy możesz popatrzeć na to pytanie http: // stackoverflow. com/questions/38351769/path-attribute-of-cookie-is-not-affecting-for-next-requests –

Odpowiedz

348

Obie domeny mydomain.com i subdomain.mydomain.com mogą udostępniać pliki cookie tylko wtedy, gdy domena jest jawnie wymieniona w nagłówku Set-Cookie. W przeciwnym razie zakres pliku cookie jest ograniczony do hosta żądania. (Jest to określane jako "host-only cookie" Zobacz What is a host only cookie?.)

Na przykład, jeśli wysłał następujący nagłówek z subdomain.mydomain.com:

Set-Cookie: name=value 

Następnie cookies nie zostaną wysłane na wnioski do mydomain.com. Jednak w przypadku korzystania z następujących, to będzie użyteczny na obu domenach:

Set-Cookie: name=value; domain=mydomain.com 

W RFC 2109, domena bez kropką oznaczało, że nie może być stosowany na subdomenach, a tylko kropką (.mydomain.com) będzie Pozwól, aby było używane 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 współczesne przeglądarki respektują nowszą specyfikację RFC 6265 i zignorują każdą wiodącą kropkę, co oznacza, że ​​można używać plików cookie w subdomenach, a także w domenie najwyższego poziomu.

Podsumowując, jeśli ustawisz plik cookie podobny do powyższego drugiego przykładu z mydomain.com, będzie on dostępny pod numerem subdomain.mydomain.com i na odwrót.

Zobacz także:

+0

Moje pytanie dotyczyło udostępniania plików cookie między domenami "domain.com" i "subdomain.domain.com", a nie między "www.domena.com" i "subdomain.domena.com". – adam0101

+1

Dzięki; Dodałem notatkę o znaczeniu kropki. – cmbuckley

+0

Więc miałem dwa pytania w moim oryginalnym wpisie. Czy mówisz, że odpowiedź brzmi "tak" dla obu, ale tylko dla nowszych przeglądarek? – adam0101

-3

Proste rozwiązanie

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM); 

5-ty parametr SetCookie określa, (pod) domen, że plik cookie jest dostępne. Ustawienie go (example.com) sprawia, że ​​dostępne dla każdej subdomeny (np SUBDOMAIN.EXAMPLE.COM)

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

+5

To pytanie nie jest specyficzne dla PHP, uważam, że nie kwalifikuje się ono jako prawidłowe. – sergelerator

+0

Sergelerator, nie zadałem pytania. Odpowiadałem na PO. – Lawes

14

nie jestem pewien odpowiedź @cmbuckley pokazuje pełny obraz. Co czytałem to:

Unless the cookie's attributes indicate otherwise, the cookie is 
    returned only to the origin server (and not, for example, to any 
    subdomains), and it expires at the end of the current session (as 
    defined by the user agent). User agents ignore unrecognized cookie 
    attributes (but not the entire cookie). 

także

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 to oznacza, że ​​można chronić pliki cookie są odczytywane przez subdomeny/domeny, ale nie można zapobiec pisaniu plików cookie do innych domen.Więc ktoś może przepisać twoje ciasteczka na stronie, kontrolując inną poddomenę odwiedzaną przez tę samą przeglądarkę. Które mogą nie być wielkim problemem.

Strona z rewelacyjnymi ciasteczkami dostarczana przez @cmbuckley/dla tych, którzy tęsknili za nią w swojej odpowiedzi jak ja; Warto przewijania w górę iw upvoting /:

+3

Wygląda na to, że zgadzam się z tym, co mówię: jeśli nie określisz "domeny", plik cookie jest używany tylko dla hosta żądania. Oznacza to, że 'Set-Cookie: name = value' z' moja_domena.com' nie zostanie wysłane z żądaniami do subdomen. Zagraj też w [ten skrypt testowy] (http://scripts.cmbuckley.co.uk/cookies.php). – cmbuckley

+0

@ cmbuckley, ok, to, co powiedziałeś, wydaje się poprawne. Przeredaguję moją odpowiedź. Dziękuję za wskazanie tego. – akostadinov

2

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

Pozostałe odpowiedzi dają cenny wgląd, ale głównie opisują zachowanie w Chrome. ważne jest, aby zauważyć, że zachowanie jest zupełnie inne w IE. Bardzo pomocny skrypt testowy CMBuckleya pokazuje, że w (powiedzmy) Chrome pliki cookie nie są dzielone między root i subdomeny, gdy nie określono żadnej domeny. Jednak ten sam test w IE pokazuje, że są one udostępniane. Ten przypadek IE jest bliższy opisowi typu "take-home" w linku www-lub-nie-www CMBuckley. Wiem, że tak jest, ponieważ mamy system, który używał różnych ciasteczek serwujących serwery zarówno na root, jak i poddomenie. Wszystko działało dobrze, dopóki ktoś nie uzyskał dostępu do niego w IE, a dwa systemy walczyły o to, czyje ciastko sesji wygra, dopóki nie rozwalimy skrzynki.

4

Oto przykład użycia DOM cookie API (https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie), abyśmy mogli sami zobaczyć zachowanie.

Jeśli wykonujemy następujące javascript:

document.cookie = "klucz = wartość"

Wydaje się być taki sam jak wykonanie:

document.cookie = "klucz = wartość; domena = moja_domena.com"

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


Teraz, jeśli wykonać następujące JavaScript na mydomain.com:

document.cookie = "klucz = wartość; domain = .mojadomena.com"

ciasteczko Klucz staje się dostępny pod numerem mydomain.com oraz pod adresem poddomena.mydomain.com.


Wreszcie, jeśli były, aby spróbować wykonać następujące czynności na subdomain.mydomain.com:

document.cookie = "klucz = wartość; domain = .mojadomena.com"

Czy plik cookie klucz stanie się dostępny pod adresem subdomain.mydomain.com?Byłem nieco zaskoczony, że to jest dozwolone; Założę się, że złamanie zabezpieczeń dla poddomeny będzie mogło ustawić plik cookie w domenie nadrzędnej.

+1

Zastanawiam się, czy istnieją osobne specyfikacje opisujące zachowanie ciasteczek "httponly" w porównaniu do rodzaju plików cookie, które tworzysz. – adam0101

+1

Dokumenty, które wysłałeś, nie zgadzają się z Twoimi oświadczeniami. Pierwsze 2 przykłady są równoważne ** nie ** (atrybut 'domain' powoduje, że plik cookie działa na subdomeny, brak takiego atrybutu nie). Czołowe kropki są w najlepszym wypadku ignorowane, aw najgorszym aktywnie blokowane. – cmbuckley

Powiązane problemy