Не устанавливается cookie php

Типичная ошибка при установке COOKIE в PHP

Хочу поделиться одной особенностью при установке значений COOKIE, которую очень часто забывают веб-разработчики.
В моей практике исследования веб-приложений на уязвимости, за 2009-2011 года, данная ошибка встретилась в 87% веб-приложений, написанных на PHP.
Чтобы как-то уменьшить данный показатель, решил написать этот текст.

Речь пойдет даже не о httpOnly флаге, хотя его использование не менее важно и обязательно к применению.

Рассмотрим пример кода:

Данный код, очевидно, устанавливает два значения COOKIE с именами foo и foo1.
Теперь главный вопрос — для какого домена и с какими флагами?

Обратимся к первоисточнику — HTTP-ответу веб-сервера:
Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

Как видно, сервер ничего не говорит ни о домене, ни о флагах.
Тогда вопрос переходит в другую плоскость — какой домен и флаги выберет браузер для такого заголовка?

В случае с Chrome (актуальная версия 18.0.1025.168), все будет более чем хорошо и домен будет ровно такой, с которого пришел запрос. В моем примере — foo.bar.com:
Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

Если бы все было так хорошо, наверное, здесь бы не было текста…

Проверим Internet Explorer. Так как красивых плагинов для просмотра COOKIE для него я не знаю, проставим куки для домена foo.com и выведем document.cookie с домена bar.foo.com:
Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

Это очень печально. И забавно с другой стороны.
При получении в НТТР-ответе сервера
Set-cookie: foo=bar
Internet Explorer ставит foo=bar для ВСЕХ поддоменов, то есть *.foo.com в моем примере без всяких флагов, таких как httpOnly.

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

А как же остальные браузеры?

Firefox12.0httpOnlywildcard
Safari5.1.5httpOnlywildcard
Opera11.62httpOnlywildcard

Таким образом, используя конструкции

в случае использования клиентом Internet Explorer (8-9), вы проставляете COOKIE на ВСЕ поддомены от данного.

Источник

Почему мои куки не устанавливаются?

У меня есть следующая функция PHP:

И тогда я получаю печенье:

(Я только положил exit() в целях отладки)

Единственная проблема, это выходит пустым. Есть идеи?

ОБНОВИТЬ:
Вот как называется функция:

Я не включил все if() заявления, чтобы сэкономить место.

Решение

попробуйте добавить путь = /, чтобы файл cookie работал со всем сайтом, а не только с текущим каталогом (который раньше меня поймал)

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

Как и другие заголовки, куки должны быть отправлены до любого вывода из вашего
скрипт (это ограничение протокола).

Другие решения

Почему у вас возникла эта проблема

Просто, старый решение

О решениях, очевидных:

Тогда вы можете использовать это так:

И, конечно, вы должны передать это. Гораздо лучше, чем глобальные.

Вот общий синтаксис setcookie

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

Следующий случай может быть применим к некоторым программистам, имеющим, как представляется, иллюзорную проблему с настройками файлов cookie в результате неправильного использования header_remove ();

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

Вы можете обнаружить, что ваш файл cookie внезапно работает по неизвестной причине:

При первом запуске вы устанавливаете cookie и вообще не вызываете header_remove (). Затем при втором запуске вы вызываете header_remove (), вы обнаружите, что ваш cookie теперь всегда установлен.

То же самое применимо и в том случае, если вы попытаетесь изменить значение cookie перед header_remove (), вы снова потерпите неудачу, потому что он уничтожит изменения, которые вы пытаетесь внести, прежде чем они будут фактически буферизованы для пользователя.
Вы должны установить куки и любые другие заголовки по этому вопросу после header_remove (), а не до.

Если вы использовали header_remove () для намерения изменить иерархию кодов ответов HTTP для сценариев DOM, вы можете быстро разрешить этот конфликт стирания заголовка файла cookie, используя следующее для явной очистки только кодов ответов:

Это требует, чтобы вы вызывали эту функцию до любого вывода, включая и теги, а также любые пробелы.

Источник

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

cookie не устанавливается, я знаю это, потому что я сделал тестовый файл:

просто пустая страница.

код входа (где установлен файл cookie):

4 ответов

вы должны установить cookies до все заголовки отправляются.

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

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

в зависимости от содержания global.php этот может работа для вас. Все, что я сделал, это удалить любой вывод до setcookie() называется. Если global.php содержит любые пробелы или вывод HTML в нем, это не будет работать:

просто хотел отметить, у меня была проблема с setcookie не работает. Когда я исследовал файл был в кодировке UTF-8 с BOM. Когда я перекодировал его как UTF-8 без BOM setcookie работал нормально, поэтому BOM был написан до того, как мой первый тег php был обнаружен. Я думаю, что включение буферизации в моем php.ini-файл, вероятно, тоже исправлю.

кто-то может в конечном итоге найти эту информацию полезной.

У меня была еще одна проблема с обновлением cookie с помощью функции setcookie.

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

Источник

Почему мои куки не устанавливаются?

У меня есть следующая функция PHP:

И тогда я получаю печенье:

(Я только положил exit() в целях отладки)

Единственная проблема, это выходит пустым. Есть идеи?

ОБНОВЛЕНИЕ: Вот как вызывается функция:

Я не включил все if() заявления, чтобы сэкономить место.

7 ответов

Попробуйте добавить путь = /, чтобы файл cookie работал со всем сайтом, а не только с текущим каталогом (который раньше меня поймал)

Как и другие заголовки, куки должны отправляться до любого вывода из вашего скрипта (это ограничение протокола).

Почему у вас возникла эта проблема

Простое, старое решение

О решениях, очевидных:

Лучшее решение

Тогда вы можете использовать это так:

И, конечно, вы должны передать это. Гораздо лучше, чем глобальные.

Вот общий синтаксис setcookie

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

Следующий случай может быть применим к некоторым программистам, имеющим, как представляется, иллюзорную проблему с настройками файлов cookie в результате неправильного использования header_remove();

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

Вы можете обнаружить, что ваш файл cookie внезапно работает по неизвестной причине:

При первом запуске, если вы устанавливаете cookie и вообще не вызываете header_remove(), затем при втором запуске вы вызываете header_remove(), вы обнаружите, что ваш cookie теперь всегда установлен.

То же самое применимо и в том случае, если вы попытаетесь изменить значение cookie перед header_remove(), вы снова потерпите неудачу, потому что он уничтожит изменения, которые вы пытаетесь внести, прежде чем они будут фактически буферизованы для пользователя. Вы должны установить куки и любые другие заголовки по этому вопросу после header_remove(), а не до.

Если вы использовали header_remove() для намерения изменить иерархию кодов ответов HTTP для сценариев DOM, вы можете быстро разрешить этот конфликт стирания заголовка файла cookie, используя следующее для явной очистки только кодов ответов:

Источник

PHP — cookie (файлы куки)

Дата публикации: 2017-10-18

Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

От автора: в PHP cookie — это текстовые файлы, хранящиеся на компьютере клиента, они сохраняются в целях отслеживания. PHP прозрачно поддерживает HTTP-файлы cookie.

Для идентификации возвращающихся пользователей предусмотрено три этапа:

Файл на сервере отправляет набор файлов cookie в браузер. Например, имя, возраст или идентификационный номер и т. д.

Браузер сохраняет эту информацию на локальном компьютере для будущего использования.

Когда в следующий раз браузер отправляет любой запрос к веб-серверу, он отправляет эти файлы cookie на сервер, и сервер использует эту информацию для идентификации пользователя.

Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

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

Принцип работы файлов cookie

Файлы cookie обычно устанавливаются в HTTP-заголовке (хотя через JavaScript также можно устанавливать cookie непосредственно в браузере). PHP-скрипт, который устанавливает cookie, может отправлять заголовки, выглядящие приблизительно таким образом:

Как вы можете видеть, заголовок Set-Cookie содержит пару значений имени, дату GMT, путь и домен. Имя и значение будут закодированы в URL-адресе. Поле expires — это инструкция для браузера — «забыть» cookie по истечении заданного времени и даты.

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

Настройка файлов cookie с помощью PHP

PHP предоставляет для установки файла cookie функцию setcookie(). Для этой функции требуется до шести аргументов, и она должна вызываться до тега html. Для каждого файла cookie эту функцию нужно вызывать отдельно.

name — устанавливает имя файла cookie и хранится в переменной среды с именем HTTP_COOKIE_VARS. Эта переменная используется для доступа к файлам cookie.

Не устанавливается cookie php. Смотреть фото Не устанавливается cookie php. Смотреть картинку Не устанавливается cookie php. Картинка про Не устанавливается cookie php. Фото Не устанавливается cookie php

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

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

expiry — определяет время хранения cookie в секундах с 00:00:00 по Гринвичу 1 января 1970 года. По истечении этого времени cookie станет недоступным. Файлы cookie удаляются после закрытия браузера.

path — Указывает каталоги, для которых действителен файл cookie. Одиночный символ прямой косой черты задает, что файл cookie является действительным для всех каталогов.

domain — может использоваться для указания имени домена в очень больших доменах и должно содержать не менее двух периодов. Все файлы cookie действительны только для хоста и домена, для которых они созданы.

security. Может быть установлено 1, чтобы указать, что файл cookie должен передаваться только через защищенное соединение HTTPS. В противном случае это значение равно 0, и это означает, что файл cookie может передаваться через обычное соединение HTTP.

В следующем примере мы зададим для cookie name и age, согласно которому эти файлы cookie станут не действительны через час.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *