Работа с cookie в PHP
Cookie — это набор данных, который создаётся Web-сервером и который отсылается при каждом обращении к серверу. Cookie хранятся в браузере пользователя. Как правило, cookie используется для: сохранения различных настроек, уникальных для пользователя, аутентификации пользователя, различной статистики и других подобных вещей. И о работе с cookie в PHP мы и поговорим в этой статье.
Начнём с простейших вещей: с записи cookie в браузер пользователя. Для этого существует функция setcookie():
После запуска скрипта, Вы сможете посмотреть cookie. Посмотреть их можно следующим образом: либо поискать в настройках браузера, либо поискать прямо на жёстком диске, где хранятся cookie Вашего браузера, либо (самый простой способ) ввести в адресной строке: «javascript:document.cookie«. Только вводите в той же вкладке, в которой Вы запускали скрипт, потому что браузеры отделяют cookie одного сайта от другого.
Теперь встаёт вопрос: «Как вывести cookie?«. Выводятся они с помощью массива $_COOKIE:
В результате, Вы увидите «Value«. Как видите всё элементарно.
И давайте сейчас с Вами решим такую задачу: если пользователь авторизован на сайте, то поздороваться с ним, иначе вывести форму входа. Причём, если данные, введённые в форму, неправильные, то вывести соответствующее предупреждение. Реализация выглядит следующим образом:
Источник
Типичная ошибка при установке COOKIE в PHP
Хочу поделиться одной особенностью при установке значений COOKIE, которую очень часто забывают веб-разработчики.
В моей практике исследования веб-приложений на уязвимости, за 2009-2011 года, данная ошибка встретилась в 87% веб-приложений, написанных на PHP.
Чтобы как-то уменьшить данный показатель, решил написать этот текст.
Речь пойдет даже не о httpOnly флаге, хотя его использование не менее важно и обязательно к применению.
Рассмотрим пример кода:
Данный код, очевидно, устанавливает два значения COOKIE с именами foo и foo1.
Теперь главный вопрос — для какого домена и с какими флагами?
Обратимся к первоисточнику — HTTP-ответу веб-сервера:
Как видно, сервер ничего не говорит ни о домене, ни о флагах.
Тогда вопрос переходит в другую плоскость — какой домен и флаги выберет браузер для такого заголовка?
В случае с Chrome (актуальная версия 18.0.1025.168), все будет более чем хорошо и домен будет ровно такой, с которого пришел запрос. В моем примере — foo.bar.com:
Если бы все было так хорошо, наверное, здесь бы не было текста…
Проверим Internet Explorer. Так как красивых плагинов для просмотра COOKIE для него я не знаю, проставим куки для домена foo.com и выведем document.cookie с домена bar.foo.com:
Это очень печально. И забавно с другой стороны.
При получении в НТТР-ответе сервера
Set-cookie: foo=bar
Internet Explorer ставит foo=bar для ВСЕХ поддоменов, то есть *.foo.com в моем примере без всяких флагов, таких как httpOnly.
Атакующему, роль которого мне часто приходится играть при выполнении аудитов, остается найти XSS на любом поддомене целевого хоста, что на практике очень легко реализуется.
А как же остальные браузеры?
| Firefox | 12.0 | httpOnly | wildcard |
| Safari | 5.1.5 | httpOnly | wildcard |
| Opera | 11.62 | httpOnly | wildcard |
Таким образом, используя конструкции
в случае использования клиентом Internet Explorer (8-9), вы проставляете COOKIE на ВСЕ поддомены от данного.
Источник
Не работают куки
Не работают куки. На сервер отсылается get запрос, который обрабатывается. Некоторые данные записываются в базу данных. Все приходящие данные записываются в куки и должны выводиться на страницу, но они выводятся только в том браузере с которого отправляю get запрос с параметрами. В остальных браузерах значения по умолчанию или вообще не отображаются. Подскажите где ошибка. уже многое перепробовал не понимаю где ошибка.
Файл для вывода страницы sig.php
Файл обработки запросов и записи в куки michurino.php
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вложения
| michurino (2).txt (1.0 Кб, 5 просмотров) | |
| sig.txt (19.0 Кб, 6 просмотров) |
Не работают куки
Вот так я создаю куки в одном файле setcookie(«userc», $array); setcookie(«namec», $_POST); А.
Не правильно работают куки
Почему echo выводит всегда 0? 12
alex_kud, а вы в курсе, что куки — это данные, хранящиеся в браузере?
Добавлено через 2 минуты
Плюс ко всему, установка кук должна производится до любого вывода. Если вы включите отображение всех ошибок, то по-любому увидите сообщение:
alex_kud,
1) Вы запрашиваете страницу первый раз
2) Сервер формирует ответ, в нём есть заголовки, один из которых Set-Cookie, содержащий куки, которые нужно установить. На данный момент куки недоступны из массива $_COOKIE.
3) Браузер получает ответ от сервера, сохраняет у себя куки.
4) Куки станут доступны через массив $_COOKIE только тогда, когда браузер отправит на сервер новый запрос, в котором будет присутствовать заголовок Cookie.
Добавлено через 8 минут
alex_kud, sigma32.php где?
Добавлено через 26 секунд
Вы выложили два несвязанных между собой файла.
Опишу по подробнее.. промышленный контроллер с gprs модемом отсылает get запрос с текущими параметрами. Любой желающий может зайти на страницу и просмотреть содержимое страницы. Я и хотел записать принятые от контроллера значения в куки, которые будут отправляться в браузер запросившего страницу. Как тогда это реализовать?
sigma32.php это и есть файл sig
Добавлено через 5 минут
Опишу по подробнее.. промышленный контроллер с gprs модемом отсылает get запрос с текущими параметрами в michurino.php, в котором данные отбрабатываются и записываются в куки. Любой желающий может зайти на страницу и просмотреть содержимое страницы. Я и хотел записать принятые от контроллера значения в куки, которые будут отправляться в браузер запросившего страницу. Как тогда это реализовать?
Sigma32.php осуществляет вывод страницы с обновлением информации, приходящей в michurino.php
sigma32.php это и есть файл sig
зы это мое первое знакомство с web. сильно не ругайтесь
Источник
Сайт не видит созданную Cookie
Помощь в написании контрольных, курсовых и дипломных работ здесь.
InterBase не видит созданную БД в Firebird
InterBase невидит созданную БД в Firebird, что можно сделать?
WHERE не видит колонку, созданную подзапросом SELECT
Создал запрос: select postpaid_account.*,(select min(radacct.acctstarttime) from radacct where.
Здравствуйте. Учу php и столкнулся со странной особенностью. Документация на php.net говорит о.
Добрый день уважаемые! Я только начал изучать язык програмирования не надо сильно пинать. Создал.
просто сохраните тот пример отдельным скриптом
очистите куки для вашего сайта
Уменьшите интервал, допустим до 10 секунд(вместо 10 минут)
И пообновляйте страницу.
Куки в этом скрипте могут быть установлены только если они не были раньше заданы
Содержимое $_COOKIE выводится только после установки через setcookie
Вы увидите, что при задании через setcookie массив $_COOKIE не меняется
Я хотел этим показать, что вам нужно другое условие для перенаправления
Можно ввести переменную, в которую заносить успех регистрации
И уже по этой переменной определять, нужен ли редирект
Источник
setcookie
(PHP 4, PHP 5, PHP 7, PHP 8)
setcookie — Отправляет cookie
Описание
Альтернативная сигнатура доступна с PHP 7.3.0:
setcookie() задаёт cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов и , а также пустые строки и пробельные символы.
После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST .
Список параметров
» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name
Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name , допустим, ‘cookiename’ , будет доступно через $_COOKIE[‘cookiename’] .
Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).
Можно заметить, что expires принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает это преобразование автоматически.
Путь к директории на сервере, из которой будут доступны cookie. Если задать ‘/’ , cookie будут доступны во всем домене domain . Если задать ‘/foo/’ , cookie будут доступны только из директории /foo/ и всех её поддиректорий (например, /foo/bar/ ) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.
(Под)домен, которому доступны cookie. Задание поддомена (например, ‘www.example.com’ ) сделает cookie доступными в нем и во всех его поддоменах (например, w2.www.example.com). Для того, чтобы сделать cookie доступными для всего домена (включая поддомены), нужно просто указать имя домена (то есть ‘example.com’ ).
Старые браузеры, следующие устаревшему документу » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.
Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true , cookie от клиента будет передано на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (стоит обратить внимание на $_SERVER[«HTTPS»] ).
Если задано true , cookie будут доступны только через HTTP-протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS-атак (несмотря на то, что поддерживается не всеми браузерами). Стоит однако отметить, что вокруг этой возможности часто возникают споры о её эффективности и целесообразности. Может принимать значения true или false .
Ассоциативный массив ( array ), который может иметь любой из ключей: expires , path , domain , secure , httponly и samesite . При наличии любого другого ключа возникнет ошибка уровня E_WARNING . Значения имеют тот же смысл, как описано в параметрах с соответствующим именем. Значение элемента samesite должно быть либо None , либо Lax , либо Strict . Если какая-либо из допустимых опций не указана, её значения по умолчанию совпадают с значениями по умолчанию для явных параметров. Если элемент samesite не указан, cookie-атрибут SameSite не установлен.
Возвращаемые значения
Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false . Если setcookie() успешно отработает, то вернёт true . Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.
Список изменений
| Версия | Описание |
|---|---|
| 7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options . Эта подпись поддерживает также настройку cookie-атрибута SameSite. |
Примеры
Ниже представлено несколько примеров, как отправлять cookie:
Пример #1 Пример использования setcookie()
setcookie ( «TestCookie» , $value );
setcookie ( «TestCookie» , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( «TestCookie» , $value , time ()+ 3600 , «/
rasmus/» , «example.com» , 1 );
?>
Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() . Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:
// Вывести одно конкретное значение cookie
echo $_COOKIE [ «TestCookie» ];
// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>
Пример #2 Пример удаления cookie посредством setcookie()
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
rasmus/» , «example.com» , 1 );
?>
Пример #3 setcookie() и массивы
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
// отправка cookie
setcookie ( «cookie[three]» , «cookiethree» );
setcookie ( «cookie[two]» , «cookietwo» );
setcookie ( «cookie[one]» , «cookieone» );
// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ ‘cookie’ ])) <
foreach ( $_COOKIE [ ‘cookie’ ] as $name => $value ) <
$name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo » $name : $value
\n» ;
>
>
?>
Результат выполнения данного примера:
Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.
Примечания
Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.
Общие замечания:
- Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задаётся в параметре expires . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
- При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку или false , а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение ‘deleted’, а срок действия переносится на год в прошлое.
- Так как установка значения false приведёт к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для false и 1 для true .
- Cookie можно именовать, как массивы, и они будут доступны в PHP-скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имён и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.
При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.
Источник