Куки на локальном хосте с явным доменом



Я, должно быть, пропустил некоторые основные вещи о печенье. На localhost, когда я устанавливаю куки на стороне сервера и укажите домен явно как localhost (или .локальный хост.) куки, похоже, не принимаются некоторыми браузерами.



Firefox 3.5: Я проверил HTTP-запрос в Firebug. Вот что я вижу:



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


или (когда я поставил домен .localhost):



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


в любом случае, cookie не является на хранении.



IE8: Я не использовал никаких дополнительных инструментов, но cookie, похоже, также не хранится, потому что он не отправляется обратно в последующих запросах.



Opera 9.64: как localhost, так и .localhost работа, но когда я проверяю список куки в настройках, домен устанавливается на localhost.локальный, хотя он указан в разделе localhost (в группе списков).



Safari 4: как localhost и .localhost работа, но они всегда указаны в качестве .localhost в настройках. С другой стороны, cookie без явного домена, он отображается как просто localhost (без точки).



в чем проблема с localhost? Из-за такого количества несоответствий должны существовать некоторые специальные правила, касающиеся localhost. Кроме того, мне не совсем понятно, почему домены должны иметь префикс точки? RFC 2109 явно заявляет, что:




значение Атрибут домена
не содержит встроенных точек или нет
начните с точки.




почему? Документ указывает, что он должен что-то сделать с безопасностью. Я должен признать, что я не читал всю спецификацию (может быть, позже), но это звучит немного странно. Исходя из этого, установка cookies на localhost будет невозможна.

803   15  

15 ответов:

по дизайну доменные имена должны иметь не менее двух точек; в противном случае браузер будет считать их недействительными. (См. ссылку на http://curl.haxx.se/rfc/cookie_spec.html)

работая на localhost, домен cookie должен быть полностью опущен. Просто установите его в "" или NULL или FALSE вместо "localhost" не хватает.

для PHP см. комментарии к http://php.net/manual/en/function.setcookie.php#73107.

если работая с Java Servlet API, не вызывайте cookie.setDomain("...") метод на всех.

Я в целом согласен с @Ralph Buchfelder, но вот некоторое усиление этого, путем эксперимента при попытке реплицировать систему с несколькими поддоменами (например example.com, fr.example.com, de.example.com) на моей локальной машине (OS X / Apache|Chrome / Firefox).

я отредактировал/etc / hosts, чтобы указать некоторые воображаемые поддомены в 127.0.0.1:

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

Если я работаю над fr.localexample.com и я оставляю параметр домена, файл cookie хранится правильно для fr.localexample.com, но не видно в других поддоменах.

Если я использую домен ".localexample.com", cookie хранится правильно для fr.localexample.com и и виден в других поддоменах.

Если я использую домен "localexample.com", или когда я пытался домен просто "localexample" или "localhost", cookie не сохранялся.

Если я использую домен "fr.localexample.com " или". fr.localexample.com", печенье есть сохраненный правильно для fr.localexample.com и является (правильно) невидимым в других поддоменах.

таким образом, требование, что вам нужно по крайней мере две точки в домене, кажется правильным, хотя я не вижу, почему это должно быть.

Если кто-нибудь хочет попробовать это, вот некоторые полезные код:

<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>

localhost: вы можете использовать: domain: ".app.localhost" и оно будет работать. Элемент параметр'domain' требует 1 или более точек в доменном имени для установки cookies. Затем вы можете иметь сеансы, работающие через localhost поддоменов, таких как:api.app.localhost:3000.

когда файл cookie установлен с явным доменом 'localhost' следующим образом...

Set-Cookie: name=value; домен=localhost; expires=Чт, 16-Jul-2009 21: 25: 05 GMT; path=/

...тогда браузеры игнорируют его, потому что это не включает по крайней мере два периода и не является одним из семи специально обработанных доменов верхнего уровня.

...домены должны иметь по крайней мере два (2) или три (3) периода в них, чтобы предотвратить Домены вида: ".ком", ".еду", а "ва.нас". Любой домен это не удается в одном из семи специальных доменов верхнего уровня, перечисленных ниже требуется только два периода. Любой другой домен требует, по крайней мере три. Семь специальных доменов верхнего уровня: "COM", "EDU", " NET", "ORG", "GOV", "MIL"и " INT".

обратите внимание, что количество периодов выше, вероятно, предполагает, что требуется начальный период. Однако этот период игнорируется в современных браузерах и это, вероятно, следует прочитать...

по крайней мере один (1) или два (2) периода

обратите внимание, что значение по умолчанию для атрибута домена:имя хоста сервера, который сгенерировал ответ cookie.

Так обходной путь для файлов cookie, не установленных для localhost, заключается в том, чтобы просто не указывать атрибут домена и пусть браузер использует значение по умолчанию - это не похоже на то же самое ограничения, которые делает явное значение в атрибуте домена.

результаты я варьировал в зависимости от браузера.

Chrome-127.0.0.1 работал, но localhost .localhost и "" не. браузер Firefox. -localhost работал, но localhost, 127.0.0.1 и "" не работали.

не тестировались в Opera, IE или Safari

потратил много времени на устранение этой проблемы сам.

с помощью PHP, и ничего на этой странице не работал для меня. В конце концов я понял в своем коде, что параметр "secure" для PHP session_set_cookie_params () всегда было установлено значение TRUE.

Так как я не посещал localhost с https, мой браузер никогда не примет cookie. Итак, я изменил эту часть своего кода, чтобы условно установить "безопасный" параметр на основе $_SERVER ['HTTP_HOST'] быть "localhost" или нет. Теперь работает хорошо.

Я надеюсь, что это кому-то поможет.

мне гораздо больше повезло тестировать локально, используя 127.0.0.1 в качестве домена. Я не знаю, почему, но у меня были смешанные результаты с localhost и .на localhost и т. д.

ни одно из предложенных исправлений не сработало для меня-установка его в null, false, добавление двух точек и т. д.-не сработало.

в конце концов, я просто удалил домен из файла cookie, если это localhost, и теперь это работает для меня в Chrome 38.

предыдущий код (не работает):

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

новый код (сейчас работает):

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }

документ.cookie = valuename + " = " + value +"; " + expires+"; domain=; path=/";

этот " домен=; путь=/"; будет принимать динамический домен, так как его cookie будет работать в поддомене. если вы хотите проверить в localhost это будет работать

ни один из ответов здесь работал для меня. Я исправил это, поставив свой PHP как самое первое на странице.

как и другие заголовки, куки должны быть отправлены до любого вывода из скрипта (это ограничение протокола). Это требует, чтобы вы размещали вызовы этой функции до любого вывода, включая и теги, а также любые пробелы.

от http://php.net/manual/en/function.setcookie.php

есть выпуск на хроме открыт с 2011 года, что если вы явно устанавливаете домен как 'localhost', вы должны установить его как false или undefined.

Я играл вокруг немного.

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

работает в Firefox и Chrome на сегодняшний день. Однако я не нашел способа заставить его работать с curl. Я попробовал Host-Header и -- resolve, не повезло,любая помощь оценена.

однако он работает в curl, если я установил его в

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

вместо. (Который не работает с Firefox.)

еще одна важная деталь, о истекает= использовать следующий формат даты и времени: Wdy, DD-Mon-YYYY HH: MM:SS GMT (RFC6265-раздел 4.1.1).

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

У меня была такая же проблема и я исправил ее, поставив 2 точки в само название печенья без указания домена.

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly

там, кажется, проблема, когда вы используете https://<local-domain> а то http://<local-domain>. Элемент http:// сайт не отправляет куки с просьбами после https:// сайт устанавливает их. Перезагрузка и очистка кэша не помогает. Работает только ручная очистка cookies. Кроме того, если я очищаю их на https:// страница, затем http:// страница снова начинает работать.

похоже, что это связано с"строгими безопасными куки". Хорошее объяснение здесь. Это было выпущен в Chrome 58 on 2017-04-19.

похоже, что Chrome действительно записывает как безопасные куки, так и незащищенные куки, поскольку он будет показывать правильные куки в зависимости от протокола страницы при нажатии на значок адресной строки.

но Developer tools > Application > Cookies не будет показывать незащищенный файл cookie, когда есть безопасный файл cookie с тем же именем для того же домена, и он не будет отправлять незащищенный файл cookie с любыми запросами. Это похоже на ошибку Chrome, или если такое поведение ожидается, должны быть некоторые способ просмотра защищенных файлов cookie, когда на http страницы и указание на то, что они переопределяются.

обходной путь заключается в использовании различных именованных файлов cookie в зависимости от того, предназначены ли они для http-сайта или https-сайта, и называть их конкретными для вашего приложения. А __Secure- префикс указывает, что файл cookie должен быть строго безопасным, а также является хорошей практикой, потому что безопасный и небезопасный не будут сталкиваться. Есть другие преимущества тоже префиксов.

используя разные /etc/hosts домены для https и http-доступа тоже будут работать, но один случайный https://localhost посещение предотвратит любые куки с одинаковыми именами для работы на http://localhost сайты-так что это не очень хороший обходной путь.

я подал отчет об ошибке Chrome.

Comments

    Ничего не найдено.