Brakuje mi podstawowych informacji na temat plików cookie. Na localhost, kiedy ustawiam plik cookie po stronie serwera i wyraźnie określam domenę jako localhost (lub .localhost). plik cookie nie jest akceptowany przez niektóre przeglądarki.
Firefox 3.5: Sprawdziłem żądanie HTTP w Firebug. Widzę to:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
lub (kiedy ustawię domenę na .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
W obu przypadkach plik cookie nie jest przechowywany.
IE8: Nie korzystałem z żadnego dodatkowego narzędzia, ale plik cookie również nie jest przechowywany, ponieważ nie jest wysyłany z powrotem w kolejnych żądaniach.
Opera 9.64: Zarówno localhost i .localhost praca , ale kiedy sprawdzić listę cookies w preferencji, domena jest ustawiony na localhost.local mimo to wymienione w localhost (na liście grupy).
Safari 4: Zarówno localhost i .localhost praca , ale zawsze są one wymienione jako .localhost w preferencjach. Z drugiej strony plik cookie bez wyraźnej domeny, wyświetlany jako zwykły host (bez kropki).
W czym problem z localhost? Z powodu takiej liczby niespójności muszą istnieć specjalne zasady dotyczące hosta lokalnego. Ponadto nie jest dla mnie całkowicie jasne, dlaczego domeny muszą być poprzedzone kropką? RFC 2109 wyraźnie stwierdza, że:
Wartość atrybutu Domain nie zawiera osadzonych kropek lub nie zaczyna się od kropki.
Czemu? Dokument wskazuje, że ma coś wspólnego z bezpieczeństwem. Muszę przyznać, że nie przeczytałem całej specyfikacji (może zrobić to później), ale brzmi to trochę dziwnie. Na tej podstawie ustawienie plików cookie na localhost byłoby niemożliwe.
Odpowiedzi:
Z założenia nazwy domen muszą mieć co najmniej dwie kropki; w przeciwnym razie przeglądarka uzna je za nieprawidłowe. (Zobacz odniesienie na http://curl.haxx.se/rfc/cookie_spec.html )
Podczas pracy
localhost
domenę plików cookie należy całkowicie pominąć. Wystarczy ustawić go w pozycji""
lubNULL
czyFALSE
zamiast"localhost"
nie wystarczy.W przypadku PHP zobacz komentarze na http://php.net/manual/en/function.setcookie.php#73107 .
Jeśli pracujesz z API Java Servlet API, w ogóle nie wywoływaj tej
cookie.setDomain("...")
metody.źródło
Domain=
parametr podczas ustawiania ciasteczka. Jeśli po prostu ustawisz domenę na null lub pustą, być może Twoja struktura wyśleDomain=
parametr o tej wartości, zamiast go pominąć? Sprawdź np. Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Zasadniczo zgadzam się z @Ralphem Buchfelderem, ale oto pewne wzmocnienie tego, eksperymentując podczas próby replikacji systemu z kilkoma poddomenami (np. Example.com, fr.example.com, de.example.com) na mojej lokalnej maszynie ( OS X / Apache / Chrome | Firefox).
Edytowałem / etc / hosts, aby wskazać niektóre wymyślone poddomeny na 127.0.0.1:
Jeśli pracuję nad fr.localexample.com i pozostawiam parametr domeny wyłączony, plik cookie jest przechowywany poprawnie dla fr.localexample.com, ale nie jest widoczny w innych subdomenach.
Jeśli używam domeny „.localexample.com”, plik cookie jest przechowywany poprawnie dla fr.localexample.com i jest widoczny w innych subdomenach.
Jeśli korzystam z domeny „localexample.com” lub gdy próbowałem domeny „localexample” lub „localhost”, plik cookie nie był zapisywany.
Jeśli użyję domeny „fr.localexample.com” lub „.fr.localexample.com”, plik cookie jest przechowywany poprawnie dla fr.localexample.com i jest (poprawnie) niewidoczny w innych subdomenach.
Zatem wymóg, że potrzebujesz co najmniej dwóch kropek w domenie, wydaje się poprawny, nawet jeśli nie rozumiem, dlaczego tak jest.
Jeśli ktoś chce to wypróbować, oto przydatny kod:
źródło
localhost: Możesz użyć:
domain: ".app.localhost"
i będzie działać. Parametr „domena” wymaga co najmniej 1 kropki w nazwie domeny do ustawienia plików cookie. Wtedy można mieć sesje robocze subdomen localhost, takich jak:api.app.localhost:3000
.źródło
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
? Czy to część jakiegoś SPEC? I czy ma to zastosowanie do wszystkich domen niezgodnych (tych bez dwóch kropek)? Czy to również będzie działać ze starymi przeglądarkami? : ^)Gdy plik cookie ma ustawioną wyraźną domenę „localhost” w następujący sposób ...
... to przeglądarki go ignorują, ponieważ nie zawiera co najmniej dwóch kropek i nie jest jedną z siedmiu specjalnie obsługiwanych domen najwyższego poziomu .
Należy pamiętać, że liczba okresów powyżej prawdopodobnie zakłada, że wymagany jest okres wiodący. Ten okres jest jednak ignorowany w nowoczesnych przeglądarkach i prawdopodobnie powinien przeczytać ...
Zauważ, że domyślną wartością atrybutu domain jest nazwa hosta serwera, który wygenerował odpowiedź cookie .
Tak więc obejściem dla plików cookie, które nie są ustawione dla hosta lokalnego, jest po prostu brak określenia atrybutu domeny i umożliwienie przeglądarce użycia wartości domyślnej - nie wydaje się, że ma takie same ograniczenia, jak jawna wartość w atrybucie domeny.
źródło
Wyniki różniłem się w zależności od przeglądarki.
Chrome-127.0.0.1 działał, ale localhost .localhost i „” nie. Firefox- .localhost działał, ale localhost, 127.0.0.1, i „” nie.
Nie testowałem w Operze, IE ani Safari
źródło
Domain=
parametru działa.Domain=
działa również, aleDomain=localhost
nie działa.Sam spędziłem dużo czasu na rozwiązywaniu tego problemu.
Używanie PHP i nic na tej stronie nie działało dla mnie. W końcu zdałem sobie sprawę z mojego kodu, że parametr „bezpieczny” dla PHP session_set_cookie_params () zawsze był ustawiony na PRAWDA.
Ponieważ nie odwiedzałem localhost z https, moja przeglądarka nigdy nie zaakceptuje ciasteczka. Zmodyfikowałem więc tę część mojego kodu, aby warunkowo ustawić parametr „bezpieczny” na podstawie $ _SERVER [„HTTP_HOST”] jako „localhost” lub nie. Teraz działa dobrze.
Mam nadzieję, że to komuś pomoże.
źródło
Jeśli ustawiasz plik cookie z innej domeny (tj. Ustawiasz plik cookie, przesyłając żądanie XHR do krzyżowego pochodzenia), musisz upewnić się, że ustawiłeś
withCredentials
atrybut na true w XMLHttpRequest, którego używasz do pobierania pliku cookie, jak opisano tutajźródło
możesz skorzystać,
localhost.org
a raczej.localhost.org
zawsze to rozwiąże127.0.0.1
źródło
Miałem dużo więcej szczęścia testując lokalnie, używając 127.0.0.1 jako domeny. Nie jestem pewien dlaczego, ale miałem mieszane wyniki z localhost i .localhost itp.
źródło
Żadna z sugerowanych poprawek nie działała dla mnie - ustawienie na zero, fałsz, dodanie dwóch kropek itp. - nie działało.
W końcu właśnie usunąłem domenę z pliku cookie, jeśli jest to host lokalny, a teraz działa dla mnie w Chrome 38 .
Poprzedni kod (nie działał):
Nowy kod (teraz działa):
źródło
Miałem ten sam problem i naprawiłem go, umieszczając 2 kropki w samej nazwie pliku cookie bez określania domeny.
źródło
Wydaje się, że występuje problem podczas używania,
https://<local-domain>
a następniehttp://<local-domain>
.http://
Strona nie wysyłać ciasteczka z wniosków pohttps://
zestawów je na miejscu. Wymuszanie przeładowania i czyszczenie pamięci podręcznej nie pomaga. Działa tylko ręczne czyszczenie plików cookie. Ponadto, jeśli wyczyszczę je nahttps://
stronie,http://
strona zacznie ponownie działać.Wygląda na związane z „ścisłymi bezpiecznymi plikami cookie”. Dobre wyjaśnienie tutaj . Został wydany w Chrome 58 19.04.2017.
Wygląda na to, że Chrome faktycznie rejestruje zarówno bezpieczne, jak i niezabezpieczone pliki cookie, ponieważ wyświetla prawidłowe pliki cookie w zależności od protokołu strony po kliknięciu ikony paska adresu.
Ale
Developer tools > Application > Cookies
nie pokaże niezabezpieczonego pliku cookie, gdy istnieje bezpieczny plik cookie o tej samej nazwie dla tej samej domeny, ani nie wyśle niezabezpieczonego pliku cookie z żądaniami. Wydaje się, że to błąd przeglądarki Chrome lub jeśli takie zachowanie jest oczekiwane, powinien istnieć sposób na przeglądanie bezpiecznych plików cookie nahttp
stronie i wskazanie, że są one zastępowane.Obejściem tego problemu jest używanie różnych nazwanych plików cookie w zależności od tego, czy dotyczą one witryny http, czy https, oraz nazywanie ich specyficznych dla aplikacji.
__Secure-
Przedrostek wskazuje, że ciasteczka powinny być ściśle strzeżony, a także jest to dobra praktyka, ponieważ bezpieczne i niezabezpieczone nie zderzą. Są też inne korzyści z prefiksów.Korzystanie z różnych
/etc/hosts
domen dla dostępu https vs. http również działałoby, ale jedna przypadkowahttps://localhost
wizyta uniemożliwi działanie plików cookie o tych samych nazwach whttp://localhost
witrynach - więc nie jest to dobre obejście.I złożyli raport o błędzie Chrome .
źródło
document.cookie = nazwa wartości + "=" + wartość + ";" + wygasa + "; domena =; ścieżka = /";
ta „domena =; ścieżka = /”; zajmie domenę dynamiczną, ponieważ jej plik cookie będzie działał w subdomenie. jeśli chcesz przetestować na localhost, to zadziała
źródło
Żadna z odpowiedzi tutaj nie działała dla mnie. Naprawiłem to, umieszczając mój PHP jako pierwszą rzecz na stronie.
Podobnie jak inne nagłówki, pliki cookie muszą być wysyłane przed wyjściem ze skryptu (jest to ograniczenie protokołu). Wymaga to umieszczenia wywołań tej funkcji przed jakimkolwiek wyjściem, włączając w to tagi i dowolne białe znaki.
Od http://php.net/manual/en/function.setcookie.php
źródło
Od 2011 r. W Chromium występuje problem polegający na tym, że jeśli jawnie ustawiasz domenę jako „localhost”, powinieneś ustawić ją jako
false
lubundefined
.źródło
Bawiłem się trochę.
działa w Firefox i Chrome od dziś. Nie znalazłem jednak sposobu, aby to działało z zawijaniem. Próbowałem Host-Header i - rozwiązać, bez powodzenia, doceniłem każdą pomoc.
Działa to jednak w zwijaniu, jeśli ustawię to na
zamiast. (Który nie działa z Firefoksem.)
źródło
Kolejny ważny szczegół: data ważności = powinna używać następującego formatu daty i godziny: Wdy, DD-Pn-RRRR GG: MM: SS GMT ( RFC6265 - sekcja 4.1.1 ).
źródło
Po wielu eksperymentach i przeczytaniu różnych postów zadziałało. Mogłem ustawić wiele plików cookie, odczytać je z powrotem, ustawić czas ujemny i usunąć je.
źródło
Jedyną rzeczą, która działała dla mnie, było ustawienie
Path=/
pliku cookie.Co więcej, domyślna wartość atrybutu path wydaje się różnić od przeglądarki do przeglądarki, chociaż przetestowałem tylko dwie z nich (Firefox i Chrome).
Chrome próbuje ustawić plik cookie bez zmian; jeśli
path
atrybut zostanie pominięty wSet-Cookie
nagłówku, nie zostanie zapisany i zignorowany.Jednak Firefox przechowuje plik cookie nawet bez wyraźnego
path
atrybutu. Po prostu ustawia żądaną ścieżkę; mój adres URL żądania/api/v1/users
był ustawiony i ścieżka była ustawiona/api/v1
automatycznie.W każdym razie obie przeglądarki działały, gdy
path
ustawiono je na/
nawet bez wyraźnej domeny, czyliDomain=localhost
czegoś takiego. Istnieją więc pewne różnice w sposobie obsługi plików cookie przez każdą przeglądarkę.źródło