Pliki cookie na localhost z wyraźną domeną

Chyba brakuje mi jakiejś podstawowej rzeczy o ciasteczkach. Na localhost, kiedy ustawiam plik cookie po stronie serwera i określ domenę jawnie jako localhost (or .localhost). plik cookie nie wydaje się być akceptowany przez niektóre przeglądarki.

Firefox 3.5: sprawdziłem żądanie HTTP w Firebug. To co widzę to:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

Lub (gdy ustawiam 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 użyłem żadnych dodatkowych narzędzie, ale plik cookie nie wydaje się być również przechowywany, ponieważ nie jest odsyłany w kolejnych żądaniach.

Opera 9.64: zarówno localhost jak i .localhost work , ale kiedy sprawdzam listę plików cookie w preferencjach, domena jest ustawiona na localhost.lokalny, nawet jeśli jest wymieniony w localhost (w grupie list).

Safari 4: zarówno localhost jak i .localhost działa , ale są one zawsze wymienione jako .localhost w preferencjach. Z drugiej strony hand, plik cookie bez wyraźnej domeny, pokazywany jako tylko localhost (bez kropki).

Jaki jest problem z localhost? Z powodu takiej liczby niespójności muszą istnieć pewne specjalne zasady dotyczące localhost. Poza tym nie jest dla mnie do końca jasne, dlaczego domeny muszą być poprzedzone kropką? RFC 2109 wyraźnie stwierdza, że:

Wartość atrybutu domeny nie zawiera osadzonych kropek lub nie zacznij od kropki.

Dlaczego? Dokument wskazuje, że ma coś wspólnego z bezpieczeństwem. Muszę przyznać, że nie przeczytałem całej specyfikacji (może później), ale brzmi to trochę dziwnie. Na tej podstawie ustawienie plików cookie na localhost byłoby niemożliwe.
Author: Ilia Anastassov, 2009-07-16

15 answers

Z założenia nazwy domen muszą mieć co najmniej dwie kropki; w przeciwnym razie przeglądarka uzna je za nieprawidłowe. (Zob. odniesienie na http://curl.haxx.se/rfc/cookie_spec.html )

Podczas pracy nad localhost domena cookie musi zostać całkowicie pominięta. Samo ustawienie go na "" lub NULL lub FALSE zamiast "localhost" nie wystarczy.

Dla PHP, Zobacz komentarze do http://php.net/manual/en/function.setcookie.php#73107 .

Jeśli pracujesz z Java Servlet API, nie wywołaj metoda cookie.setDomain("...") w ogóle.

 192
Author: Ralph Buchfelder,
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-11-25 15:08:33

Ogólnie zgadzam się z @ Ralph Buchfelder, ale tutaj jest pewne wzmocnienie tego, eksperymentując przy próbie replikacji systemu z kilkoma subdomenami (takimi jak example.com, fr.example.com, de.example.com) na moim komputerze lokalnym (OS X / Apache / Chrome / Firefox).

Edytowałem /etc / hosts, aby wskazać niektóre wymyślone subdomeny na 127.0.0.1:

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

Jeśli pracuję nad fr.localexample.com i zostawiam parametr domeny, 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, oraz jest widoczne w innych subdomenach.

Jeśli używam domeny "localexample.com", lub kiedy próbowałem domeny o nazwie" localexample "lub" localhost", plik cookie nie był zapisywany.

Jeśli używam domeny "fr.localexample.com " lub". fr.localexample.com", plik cookie jest przechowywany poprawnie dla fr.localexample.com i jest (poprawnie) niewidoczny w innych subdomenach.

Więc wymóg, że potrzebujesz co najmniej dwóch kropek w domenie wydaje się być poprawny, mimo że nie widzę powodu.

Jeśli ktoś chce to wypróbować, oto jakiś przydatny kod:

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>
 27
Author: xgretsch,
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
2013-05-20 14:58:35

Localhost: możesz użyć: domain: ".app.localhost" i będzie działać. Parametr 'domena' wymaga 1 lub więcej kropek w nazwie domeny do ustawienia plików cookie. Następnie możesz mieć sesje działające w subdomenach localhost, takich jak: api.app.localhost:3000.

 21
Author: AmpT,
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
2014-02-27 13:45:32

Gdy plik cookie jest ustawiony z jawną domeną "localhost" w następujący sposób...

Set-Cookie: nazwa=wartość; domain=localhost; expires=Thu, 16-Jul-2009 21: 25: 05 GMT; path=/

...następnie przeglądarki ignorują go, ponieważ nie zawiera co najmniej dwóch okresów i nie jest jedną z siedmiu specjalnie obsługiwanych domen najwyższego poziomu.

...domeny muszą mieć co najmniej dwa (2) lub trzy (3) okresy do zapobieganie domenom formularza:". com", ". edu", oraz "va.us". każda domena to nie powiedzie się w jednej z siedmiu specjalnych domen najwyższego poziomu wymienionych poniżej wymagają tylko dwóch okresów. Każda inna domena wymaga co najmniej trzy. Siedem specjalnych domen najwyższego poziomu to: "COM", "EDU", " NET", "ORG", "GOV", " MIL " i "INT".

Zauważ, że liczba okresów powyżej prawdopodobnie zakłada, że wymagany jest okres wiodący. Ten okres jest jednak ignorowany w nowoczesnych przeglądarkach {[10] } i prawdopodobnie powinien być przeczytany...

At najmniej jeden (1) lub dwa (2) okresy

Należy zauważyć, że domyślną wartością atrybutu domeny jest Nazwa hosta serwera, który wygenerował odpowiedź cookie.

Więc obejściem dla plików cookie, które nie są ustawione dla localhost, jest po prostu nie określać atrybutu domeny i pozwolić przeglądarce używać wartości domyślnej - wydaje się, że nie ma to takich ograniczeń, jak Jawna wartość atrybutu domeny.

 9
Author: Scott Munro,
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-05-23 11:47:36

Wyniki zmieniałem 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, a "" nie.

Nie testowano w Opera, IE lub Safari

 3
Author: ,
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
2012-08-23 13:17:15

Spędziłem dużo czasu rozwiązując ten problem sam.

Korzystanie z PHP, i nic na tej stronie nie działa dla mnie. W końcu zdałem sobie sprawę w moim kodzie, że 'Bezpieczny' parametr PHP session_set_cookie_params () był zawsze ustawiany na TRUE.

Ponieważ nie odwiedzałem localhost z https, moja przeglądarka nigdy nie zaakceptowałaby pliku cookie. Tak więc zmodyfikowałem tę część mojego kodu, aby warunkowo ustawić "bezpieczny" param na podstawie $_SERVER ['HTTP_HOST'] jako "localhost" lub nie. Teraz działa dobrze.

Mam nadzieję, że to komuś pomoże.

 2
Author: James Jacobson,
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-12-15 09:16:06

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.

 1
Author: toby,
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
2012-04-01 18:28:51

Żadna z sugerowanych poprawek nie zadziałała - ustawienie na null, false, dodanie dwóch kropek itp. - nie zadziałało.

W końcu właśnie usunąłem domenę z pliku cookie, jeśli jest to localhost i teraz działa dla mnie w Chrome 38 .

Poprzedni kod (nie działał):

document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';

Nowy kod (teraz działa):

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }
 1
Author: DJ_Polly,
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
2014-11-05 03:42:09

Dokument.cookie = valuename + "=" + value+"; " + expires +"; domain=; path=/";

Ta " domena=; ścieżka=/"; przyjmie dynamiczną domenę, ponieważ jej plik cookie będzie działał w subdomenie. jeśli chcesz przetestować w localhost to zadziała

 0
Author: Abhishek SInha,
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
2014-10-07 09:35:15

Żadna z odpowiedzi nie zadziałała. Naprawiłem to, umieszczając moje PHP jako pierwszą rzecz na stronie.

podobnie jak inne nagłówki, pliki cookie muszą być wysyłane przed jakimkolwiek wyjściem ze skryptu (jest to ograniczenie protokołu). Wymaga to umieszczenia wywołań tej funkcji przed dowolnym wyjściem, w tym znaczników and, a także białych znaków.

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

 0
Author: john ktejik,
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
2015-01-09 23:29:59

Istnieje problem na Chromium otwarty od 2011 roku, że jeśli jawnie ustawiasz domenę jako 'localhost', powinieneś ustawić ją jako false LUB undefined.

 0
Author: Bruno Peres,
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
2015-07-14 20:58:55

Trochę się bawiłem.

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

Działa w Firefoksie i Chrome od dziś. Jednak nie znalazłem sposobu, aby to działało z curl. Próbowałem Host-Header i -- resolve, no luck, any help appreciated.

Jednak działa w curl, jeśli ustawiłem go na

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/
Zamiast tego. (Który nie działa z Firefoksem.)
 0
Author: Micha,
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-01-30 21:41:48

Kolejny ważny szczegół, expires = powinien używać następującego formatu daty i czasu: Wdy, DD-Mon-YYYY HH: MM: SS GMT (RFC6265-sekcja 4.1.1).

Set-Cookie:
  name=value;
  domain=localhost;
  expires=Thu, 16-07-2019 21:25:05 GMT;
  path=/
 0
Author: Tralamazza,
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-08-14 09:42:06

Miałem ten sam problem i naprawiłem go, umieszczając 2 kropki w samej nazwie pliku cookie bez określania żadnej domeny.

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
 0
Author: Eric B.,
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-01-24 15:22:36

Wydaje się, że występuje problem, gdy używasz https://<local-domain>, a następnie http://<local-domain>. Strona http:// nie wysyła plików cookie z żądaniami po ustawieniu ich przez stronę https://. Wymuś przeładowanie i wyczyść pamięć podręczną nie pomaga. Działa tylko ręczne czyszczenie plików cookie. Ponadto, jeśli wyczyszczę je na stronie https://, strona http:// zacznie działać ponownie.

Wygląda na związane z"Strict secure cookies". Dobre wyjaśnienie tutaj . Został wydany w Chrome 58 w dniu 2017-04-19.

Wygląda jak chrom w rzeczywistości zapisuje zarówno bezpieczne pliki cookie, jak i niezabezpieczone pliki cookie, ponieważ wyświetli prawidłowe pliki cookie w zależności od protokołu Strony po kliknięciu ikony paska adresu.

Ale Developer tools > Application > Cookies nie wyświetli niezabezpieczonego pliku cookie, gdy istnieje bezpieczny plik cookie o tej samej nazwie dla tej samej domeny, ani nie wyśle niezabezpieczonego pliku cookie z żadnymi żądaniami. Wygląda to na błąd Chrome, lub jeśli takie zachowanie jest oczekiwane, powinien istnieć sposób na wyświetlenie bezpiecznych plików cookie, gdy na stronie http i / align = "left" /

Obejście polega na używaniu różnych nazwanych plików cookie w zależności od tego, czy są one przeznaczone dla witryny http czy witryny https, i nazwaniu ich specyficznymi dla Twojej aplikacji. Prefiks __Secure- oznacza, że plik cookie powinien być ściśle zabezpieczony, a także jest dobrą praktyką, ponieważ bezpieczne i niezabezpieczone nie kolidują ze sobą. Istnieją inne korzyści również dla przedrostków.

Używanie różnych domen /etc/hosts dla https vs. http access też by działało, ale jeden przypadkowy https://localhost wizyta uniemożliwi działanie plików cookie o tych samych nazwach na stronach http://localhost - więc nie jest to dobre obejście.

Złożyłem raport o błędzie Chrome .

 0
Author: vaughan,
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-05-15 22:51:39