Php cookies / куки
Содержание:
- Введение:
- More Examples
- Семья и дети Александра Градского
- Приложение: Функции для работы с куки
- Описание
- Получение значения куки
- Приватность и сторонние куки.
- Подробная инструкция по работе с Cookie на jQuery
- Cookie: удаление
- Как удалить куку php?
- Что такое Cookie?
- Summary
- Attributes
- Сборка вешалки из фанеры
- Приложение: Сторонние куки
- Заголовки Set-Cookie и Cookie
- Examples
- Definition and Usage
- Browser compatibility
- Особенности работы протокола HTTP
Введение:
Откуда возник термин «cookie» никто достоверно не знает, хотя считается, что во времена зарождения Unix-систем где-то использовалось словосочетание Magic Cookies. Имелись в виду «квитанции» (token, ticket), которыми обменивались программы.
Cookie является решением одной из наследственных проблем HTTP протокола (HyperText Transfer Protocol). Эта проблема заключается в непостоянстве соединения между клиентом и сервером, как при FTP или Telnet сессии, т.е. для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос. Включение cookie в HTTP протокол дало частичное решение этой проблемы. Иначе говоря, транзакция завершается после того, как браузер сделал запрос, а сервер выдал соответствующий ответ. Сразу после этого сервер «забывает» о пользователе и каждый следующий запрос того же пользователя считает новым пользователем.
Используя cookie, можно эмулировать сессию по HTTP протоколу. Коротко принцип эмуляции сессии таков: на первом запросе выдается соотвествующее значение cookie, а при каждом последующем запросе это значение читается из переменной окружения HTTP_COOKIE и соответствующим образом обрабатывается.
Простой пример: есть форма, где пользователю предлагается указать свое имя, из нее вызывается скрипт, прописывающий значение cookie в браузер пользователя. При каждом последующем заходе на основе анализа значения cookie из браузера пользователя на странице появляется либо именное приветствие (если есть установленное значение cookie), либо первоначальная форма с запросом имени пользователя (если значение cookie не установлено).
Итак,приступим к практике:
More Examples
Example
Several expire dates for cookies:
<?php$value = «Hello world!»;// cookie will expire when the browser closesetcookie(«myCookie», $value);// cookie will expire in 1 hoursetcookie(«myCookie», $value, time() + 3600);// cookie will expire in 1 hour, and will only be available// within the php directory + all sub-directories of phpsetcookie(«myCookie», $value, time() + 3600, «/php/»);?> <html><body>…some code…</body></html>
Example
To modify a cookie, just set (again) the cookie using the setcookie() function:
<?php$cookie_name = «user»;$cookie_value = «Alex Porter»;
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), «/»);?><html><body><?phpif(!isset($_COOKIE)) { echo «Cookie named ‘» . $cookie_name . «‘ is not set!»;} else { echo «Cookie ‘» . $cookie_name . «‘ is set!<br>»; echo «Value is: » . $_COOKIE;}?></body></html>
Example
To delete a cookie, use the setcookie() function with an expiration date in the past:
<?php// set the expiration date to one hour agosetcookie(«user», «», time() — 3600);?><html><body><?phpecho «Cookie ‘user’ is deleted.»;?></body></html>
Example
Create a small script that checks whether cookies are enabled. First, try to create a test cookie with the setcookie() function, then count the $_COOKIE array variable:
<?phpsetcookie(«test_cookie», «test», time() + 3600, ‘/’);?>
<html><body><?phpif(count($_COOKIE) > 0) { echo «Cookies are enabled.»;} else { echo «Cookies are disabled.»;}?>
</body></html>
❮ PHP Network Reference
Семья и дети Александра Градского
Семья и дети Александра Градского – это то, что в настоящее время занимает особое место в его жизни. В настоящее время Семья композитора состоит из жены Марины и троих детей – Даниила, Александра и Марии Градских.
Напомним, что Даниил и Мария Градские – уже давно взрослые люди и на сегодняшний день одни также, как и их отец, работают в области шоу-бизнеса, хоть и не смогли достичь в нем таких высот, как и он. Хотя, справедливости ради, стоит упомянуть, что они ни к чему подобному и не стремились. Кроме того, не стоит забывать и о самом младшем наследнике музыканта, которого ему подарила последняя жена – Марина.
Приложение: Функции для работы с куки
Вот небольшой набор функций для работы с куки, более удобных, чем ручная модификация .
Для этого существует множество библиотек, так что они, скорее, в демонстрационных целях. Но при этом полностью рабочие.
Самый короткий способ получить доступ к куки – это использовать регулярные выражения.
Функция возвращает куки с указанным :
Здесь генерируется динамически, чтобы находить .
Обратите внимание, значение куки кодируется, поэтому использует встроенную функцию для декодирования. Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):
Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):
Чтобы удалить куки, мы можем установить отрицательную дату истечения срока действия:
Операции обновления или удаления куки должны использовать те же путь и домен
Обратите внимание: когда мы обновляем или удаляем куки, нам следует использовать только такие же настройки пути и домена, как при установке куки. Всё вместе: cookie.js
Всё вместе: cookie.js.
Описание
int setcookie (string name ]]]])
setcookie() определяет куку для отправки вместе с остальной header-информацией.Куки
обязаны быть отправлены до любых других шапок/headers (это
ограничение кук, а не РНР). Это требует, чтобы вы помещали вызовы этой
функции перед тэгами <html> или
<head>.
Все аргументы, кроме name, являются необязательными.Если имеется только аргумент name, кука с этим
именем будет удалена с удалённого клиента.Вы можете также заместить любой
аргумент пустой строкой («»), чтобы пропустить этот аргумент.Аргументы expire и
secure это целые числа/integer и они не могут быть пропущены с помощью пустой строки.
В них используйте нуль
().Аргумент
expire это обычное Unix time
integer, возвращаемое функциями time() или
mktime().Аргумент
secure указывает, что данная кука должна передаваться только через секретное HTTPS-соединение.
После того как куки установлены, доступ к ним может быть получен при
загрузке следующей страницы через массив $_COOKIE (который вызывается
$HTTP_COOKIE_VARS в версиях PHP до 4.1.0).
Обычные ловушки:
-
Куки будут невидимы до тех пор, пока не будет загружена следующая
страница. -
Куки обязаны быть удалены с теми же параметрами, с которыми были
установлены.
В PHP 3 множественные вызовы setcookie() в том же скрипте могут быть выполнены в реверсном порядке. Если вы пытаетесь
удалить одну куку до вставки другой, вы должны сделать вставку до удаления.
В PHP 4 множественные вызовы
setcookie() выполняются в порядке вызова.
Далее идут примеры отправки кук:
Пример 1. Отправка кук функцией setcookie()
|
При удалении куки вы должны убедиться, что дата окончания действия прошла,
чтобы переключить механизм в вашем браузере.
Далее идут примеры удаления куки, созданной в предыдущем примере:
Пример 2. Удаление куки с помощью setcookie()
|
Обратите внимание, что часть value куки будет автоматически
urlencoded при отправке куки, и, когда она получена, она автоматически
декодируется и присваивается переменной с тем же именем, что и имя куки.
Для просмотра содержимого нашей тестовой куки в скрипте просто используйте
один из следующих примеров:
echo $TestCookie; echo $_COOKIE; |
Вы можете также установить куки массива, используя нотацию в имени куки.
Это даёт эффект установки стольких кук, сколько элементов в этом массиве,
но, когда кука получается скриптом, значения помещаются в массив с именем
куки:
setcookie ("cookie", "cookiethree"); setcookie ("cookie", "cookietwo"); setcookie ("cookie", "cookieone"); if (isset ($cookie)) { while (list ($name, $value) = each ($cookie)) { echo "$name == $value<br>\n"; } } |
О куках дополнительно см. спецификацию Netscape по адресу: http://www.netscape.com/newsref/std/cookie_spec.html.
Microsoft Internet Explorer 4 с Service Pack 1 некорректно работает с
куками, которые имеют установленный параметр path.
Netscape Communicator 4.05 и Microsoft Internet Explorer 3.x
обрабатывают куки некорректно, если path и time не установлены.
Получение значения куки
Для того, чтобы получить значение предварительно установленного куки для текущего документа, нужно использовать свойство :
Таким образом возвращается строка, которая состоит из списка пар имя/значение, разделенных точкой с запятой для всех куки, которые действуют для текущего документа. Например:
В данном примере 2 куки, которые были предварительно установлены: , который имеет значение , и , который имеет значение .
Функция для получения значения куки
Обычно, нам нужно только значение одного куки за один раз. Поэтому строка куки не удобна для использования! Здесь приводится функция, которая обрабатывает строку , возвращет только то куки, которое представляет интерес в конкретный момент:
Данная функция использует регулярное выражение для поиска имени куки, которое представляет интерес, а затем возвращает значение, которое обработано функцией для перекодирования к нормальному символьному виду. (Если куки не найдено, возвращается значение null.)
Данная функция проста в использовании. Например, для возврата значения куки :
Приватность и сторонние куки.
Куки значительным образом влияют на конфиденциальность и анонимность пользователей Интернета. Хотя куки отправляются только на серверы домена, для которого они предназначены, веб-страница может подгружать изображения или другие компоненты из других доменов. Куки, получаемые во время подгрузки этих компонентов из других доменов, называются «сторонними».
Устанавливая баннеры на разных сайтах и используя сторонние куки, рекламная компания может отследить перемещение пользователей между этими сайтами.
Рекламные компании используют сторонние куки для отслеживания перемещений пользователя по сайтам. В частности, рекламная компания может отслеживать пользователей на всех сайтах, где установлены их рекламные баннеры. Знание страниц, посещённых пользователем, позволяет менять направленность рекламы в зависимости от предпочтений пользователя.
Создание профиля пользователей рассматривается как потенциальная угроза приватности даже при отслеживании в рамках одного домена, но особенно это актуально при отслеживания на нескольких доменах с использованием сторонних куки. По этой причине в некоторых странах куки регулируются законодательством.
Правительство Соединенных Штатов приняло строгие законы в отношении куки в 2000 году, после того, как выяснилось, что Агентство по борьбе с наркотиками США использовало куки для отслеживания пользователей, просмотревших их антинаркотическую рекламу в сети. В 2002 году Дэниел Брандт установил, что ЦРУ устанавливает на компьютеры постоянные куки со сроком хранения до 2010 года. Когда ЦРУ было уведомлено о неправомерности подобного использования куки, управление заявило, что это было непреднамеренно и прекратило их установку. 25 декабря 2005 года Брандт обнаружил, что Агентство национальной безопасности оставляло пару постоянных куки после обновления программного обеспечения. После этого сообщения Агентство немедленно отключило куки.
Директива Евросоюза о конфиденциальности электронных данных от 2002 года держит нормы, касающиеся использования куки. В частности, пункт 3 статьи 5 устанавливает, что хранение данных (в том числе куки) может осуществляться лишь если:
- пользователю предоставляется информация о том, как эти данные используются;
- пользователь имеет возможность отказаться от этого.
Тем не менее, в данной статье также говорится, что хранение технически необходимых данных освобождается от этих норм. Ожидалось, что директива вступит в силу с октября 2003 года, но доклад от декабря 2004 года отмечает, что эти положения не нашли применения на практике и что в некоторых государствах (Словакия, Латвия,Греция, Бельгия и Люксембург) эти положения не внесены в национальные законодательства. Доклад предлагает провести тщательный анализ ситуации в государствах, участвующих в договоре.
Спецификация P3P включает возможность для веб-сервера сообщить браузеру о нарушении конфиденциальности, указывая характер собираемой информации и цели сбора. Сюда входит и использование информации, полученной с помощью куки. По спецификации P3P браузер может принимать или отклонять куки согласно пользовательским настройкам или же спросить пользователя.
Многие веб-браузеры, включая Safari от Apple и Internet Explorer версий 6 и 7 от Microsoft, поддерживают спецификации P3P, которые позволяют определить, следует ли разрешать сторонние куки. Веб-браузер Opera позволяет пользователям отказаться от сторонних куки и создать глобальные или выборочные профили безопасности для веб-доменов. Firefox 2 был лишён этой опции, но она была восстановлена в версии 3.
Подробная инструкция по работе с Cookie на jQuery
Первым делом скачайте архив в конце статьи. Разархивируйте, файл «jquery.cookie.js» загрузите на ваш сайт, после чего подключите его в секции HEAD. О том, какие варианты подключения скриптов существуют, читайте в нашей инструкции.
1. Установка Cookie
Теперь мы можем попробовать создать наш первый куки:
Что здесь что?
«cookie_name» – имя куки;
«cookie_value» – значение куки;
«expires» – количество дней хранения куки (в нашем случае – 3 дня). По истечении этого времени произойдет автоматическое удаление куки;
«path» – доступность куки на сайте (в нашем случае «» — доступна на всем сайте). По желанию можно задать только определенную страницу или раздел, где будет доступен куки, например, «/audio/rock»;
«domain» – домен, на котором куки действителен. Если у вас есть поддомен, то можете указать его в этом параметре, например, «domain: «subdomain.your_site.ru»», и в таком случае куки будет доступен только на домене «subdomain.your_site.ru»;
«secure» – параметр, указывающий, что куку нужно передавать по защищенному протоколу https.
Здесь не все параметры являются обязательными и для того, чтобы задать куки, вполне хватит этой конструкции:
2. Получение Cookie
Получить куки довольно просто, сделать это можно с помощью кода:
Данный код можно присвоить к переменной и использовать в своих нуждах:
Согласитесь, это весьма удобно.
3. Удаление Cookie
Чтобы удалить значение куки, присвойте ему значение «null»:
На этом, я думаю, знакомство с работой с Cookie на jQuery закончено. Этих знаний вполне хватит для реализации ваших идей.
Cookie: удаление
Рис. 9.4. Удаление cookie
Задание 9_3: удалить cookie из задания 9_1 и повторно обновить браузер.
Лабораторная работа 9_1:
Создать файл cookie.php.Задача:
При первом запросе страницы cookie.php пользователем, выводить фразу «Добро пожаловать!»
При повторных запросах:
Выводить количество посещений. Например: «Вы зашли на страницу 5 раз»
Указывать дату и время последнего посещения. Например: «Последнее посещение: 20-08-2009 16:34:45»
date('d/m/Y H:i:s') |
Алгоритм выполнения:
- Инициализируйте переменную для подсчета количества посещений
- Если соответствующие данные передавались через куки, сохраняйте их в эту
переменную - Нарастите счетчик посещений
- Инициализируйте переменную для хранения значения последнего посещения
страницы - Если соответствующие данные передавались из куки, отфильтруйте их и сохраните в эту переменную
- Установите соответствующие куки (для счетчика и для даты)
- Выводите информацию о количестве посещений и дате последнего посещения
Результат:
Как удалить куку php?
Нет ничего проще, чем удалить куки. Для этого нам достаточно создать куку с тем же названием, с любым содержанием, обычно, с пустым, и просто задать дату истечения срока действия ту, которая уже прошла. Например:
1 | setcookie(‘wpguru’,»,time()-4444); |
Теперь кука удалится!
Одно важное замечание, о котором никто не говорит. Когда я только начинал изучать программирование, я удалил куку этим способом
Зашел в браузер — кука осталась. Перерыл все форумы — такая проблема часто встречается, но все отвечают мол: «Хм, не знаю, у меня работает». А причина вот в чем — кука удаляется, но не из файлов пользователя. Там она остается. И открывая браузер, Вы ее видите, но если мы обратимся к ней посредством $_COOKIE, то в результате будет 0. Вот так можно легко проверить, удалена ли кука.
На этом у меня все, в ближайшее время будут выходить еще статьи. Скорей всего я опишу в следующей статьи, какие планы ждут блог, и подробно расскажу про серию статей о заработке. Все будет в онлайн-режиме, т.е. я зарабатываю, и пишу статью. А не просто теорию вещаю.
Так что ждите.
До скорых встреч!
Что такое Cookie?
Куки очень полезны для хранения информации непосредственно в самом браузере пользователя. Это простой текстовый файл , который хранит максимум 4кб данных .
Куки создаются с помощью браузера по запросу сервера (в соответствии с логикой программы). После того, как печенье создается на стороне пользователя, его браузер отправляет эту информацию(из куки) обратно на сервер с помощью HTTP — заголовка.
Зачастую в куках хранятся логины, пароли и прочее. Например вы заходите на сайт, вводите свой логин и пароль. Сайт автоматом создаёт у вас куки с этими данными. И при следующем посещении сайта, он просто проверяет наличие кук, и подгружает данные сохранённого в них пользователя.
Summary
provides access to cookies
- write operations modify only cookies mentioned in it.
- name/value must be encoded.
- one cookie up to 4KB, 20+ cookies per site (depends on a browser).
Cookie options:
- , by default current path, makes the cookie visible only under that path.
- , by default a cookie is visible on current domain only, if set explicitly to the domain, makes the cookie visible on subdomains.
- or sets cookie expiration time, without them the cookie dies when the browser is closed.
- makes the cookie HTTPS-only.
- forbids the browser to send the cookie with requests coming from outside the site, helps to prevent XSRF attacks.
Additionally:
- Third-party cookies may be forbidden by the browser, e.g. Safari does that by default.
- When setting a tracking cookie for EU citizens, GDPR requires to ask for permission.
Attributes
- A cookie begins with a name-value pair:
- A can be any US-ASCII characters, except control characters, spaces, or tabs. It also must not contain a separator character like the following: .
- A can optionally be wrapped in double quotes and include any US-ASCII characters excluding control characters, Whitespace, double quotes, comma, semicolon, and backslash. Encoding: Many implementations perform URL encoding on cookie values, however it is not required per the RFC specification. It does help satisfying the requirements about which characters are allowed for <cookie-value> though.
- prefix: Cookies names starting with (dash is part of the prefix) must be set with the flag from a secure page (HTTPS).
- prefix: Cookies with names starting with must be set with the flag, must be from a secure page (HTTPS), must not have a domain specified (and therefore aren’t sent to subdomains) and the path must be .
- Optional
-
The maximum lifetime of the cookie as an HTTP-date timestamp. See for the required formatting.
If unspecified, the cookie becomes a session cookie. A session finishes when the client shuts down, and session cookies will be removed.
Warning: Many web browsers have a session restore feature that will save all tabs and restore them next time the browser is used. Session cookies will also be restored, as if the browser was never closed.
When an Expires date is set, the deadline is relative to the client the cookie is being set on, not the server.
- Optional
- Number of seconds until the cookie expires. A zero or negative number will expire the cookie immediately. If both and are set, has precedence.
- Optional
- Host to which the cookie will be sent.
- If omitted, defaults to the host of the current document URL, not including subdomains.
- Contrary to earlier specifications, leading dots in domain names () are ignored.
- Multiple host/domain values are not allowed, but if a domain is specified, then subdomains are always included.
- Optional
- A path that must exist in the requested URL, or the browser won’t send the header.
- The forward slash () character is interpreted as a directory separator, and subdirectories will be matched as well: for , , , and will all match.
- Optional
- Cookie is only sent to the server when a request is made with the scheme (except on localhost), and therefore is more resistent to man-in-the-middle attacks.
Note: Do not assume that prevents all access to sensitive information in cookies (session keys, login details, etc.). Cookies with this attribute can still be read/modified with access to the client’s hard disk, or from JavaScript if the cookie attribute is not set.
Note: Insecure sites () can’t set cookies with the attribute (since Chrome 52 and Firefox 52). For Firefox, the requirements are ignored when the attribute is set by localhost (since Firefox 75).
- Optional
- Forbids JavaScript from accessing the cookie, for example, through the property. Note that a cookie that has been created with HttpOnly will still be sent with JavaScript-initiated requests, e.g. when calling or . This mitigates attacks against cross-site scripting (XSS).
- Optional
- Controls whether a cookie is sent with cross-origin requests, providing some protection against cross-site request forgery attacks (CSRF).
-
Standards related to the SameSite Cookies recently changed such that:
- The cookie-sending behaviour if is not specified is . Previously the default was that cookies were sent for all requests.
- Cookies with must now
also specify the attribute (i.e. they require a secure context).
The options below covers the new behaviour. See the table for information about specific browser implementation (rows: «: Defaults to » and «: Secure context required»).
Inline options are:
- : The browser sends the cookie only for same-site requests (that is, requests originating from the same site that set the cookie). If the request originated from a different URL than the current one, no cookies with the attribute are sent.
-
: The cookie is not sent on cross-site requests, such as calls to load images or frames, but is sent when a user is navigating to the origin site from an external site (e.g. if following a link).
This is the default behaviour if the attribute is not specified. - : The browser sends the cookie with both cross-site and same-site requests. The attribute must also be set when !
Сборка вешалки из фанеры
Приложение: Сторонние куки
Куки называются сторонними, если они размещены с домена, отличающегося от страницы, которую посещает пользователь.
Например:
Страница загружает баннер с другого сайта: .
Вместе с баннером удалённый сервер может установить заголовок с куки, например,
Такие куки создаются с домена и будут видны только на сайте :
В следующий раз при доступе к удалённый сервер получит куки и распознает пользователя:
Что ещё более важно, когда пользователь переходит с на другой сайт , на котором тоже есть баннер, то получит куки, так как они принадлежат , таким образом распознает пользователя и может отслеживать его перемещения между сайтами:. Сторонние куки в силу своей специфики обычно используются для целей отслеживания посещаемых пользователем страниц и показа рекламы
Они привязаны к исходному домену, поэтому ads.com может отслеживать одного и того же пользователя на разных сайтах, если оттуда идёт обращение к нему
Сторонние куки в силу своей специфики обычно используются для целей отслеживания посещаемых пользователем страниц и показа рекламы. Они привязаны к исходному домену, поэтому ads.com может отслеживать одного и того же пользователя на разных сайтах, если оттуда идёт обращение к нему.
Естественно, некоторым пользователям не нравится, когда их отслеживают, поэтому браузеры позволяют отключать такие куки.
Кроме того, некоторые современные браузеры используют специальные политики для таких куки:
- Safari вообще не разрешает сторонние куки.
- У Firefox есть «чёрный список» сторонних доменов, чьи сторонние куки он блокирует.
Если мы загружаем скрипт со стороннего домена, например , и этот скрипт использует , чтобы установить куки, то такое куки не является сторонним.
Если скрипт устанавливает куки, то нет разницы откуда был загружен скрипт – куки принадлежит домену текущей веб-страницы.
Заголовки Set-Cookie и Cookie
Заголовок используется для отправки cookie с сервера на клиентское приложение (браузер). Этот заголовок с сервера дает клиенту указание сохранить cookie.
Set-Cookie: <имя-cookie>=<значение-cookie>
HTTP/1.1 200 OK Date: Sun, 07 Oct 2018 13:31:17 GMT Server: Apache/2.4.34 (Win64) mod_fcgid/2.3.9 X-Powered-By: PHP/7.1.10 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; path=/ Set-Cookie: visitor=0d3749f09d222bea3b8f163937eb9bf1; Max-Age=31536000; path=/ Set-Cookie: lastvisit=1538919655; path=/ Vary: Accept-Encoding Content-Encoding: gzip Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> ..........
Теперь, с каждым новым запросом к серверу, при помощи заголовка браузер будет возвращать серверу все сохраненные ранее cookies:
GET /catalog HTTP/1.1 Host: www.server.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://www.server.com/ Cookie: PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; visitor=0d3749f09d222bea3b8f163937eb9bf1; lastvisit=1538919655 Connection: keep-alive Upgrade-Insecure-Requests: 1
Examples
Session cookies are removed when the client shuts down. Cookies are session cookies if they don’t specify the or attributes.
Set-Cookie: sessionId=38afes7a8
Instead of expiring when the client is closed, permanent cookies expire at a specific date () or after a specific length of time ().
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000
Invalid domains
A cookie for a domain that does not include the server that set it .
The following cookie will be rejected if set by a server hosted on :
Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk
A cookie for a sub domain of the serving domain will be rejected.
The following cookie will be rejected if set by a server hosted on :
Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com
Cookie prefixes
Cookies names prefixed with or can be used only if they are set with the attribute from a secure (HTTPS) origin.
In addition, cookies with the prefix must have a path of (meaning any path at the host) and must not have a attribute.
For clients that don’t implement cookie prefixes, you cannot count on these additional assurances, and prefixed cookies will always be accepted.
// Both accepted when from a secure origin (HTTPS) Set-Cookie: __Secure-ID=123; Secure; Domain=example.com Set-Cookie: __Host-ID=123; Secure; Path=/ // Rejected due to missing Secure attribute Set-Cookie: __Secure-id=1 // Rejected due to the missing Path=/ attribute Set-Cookie: __Host-id=1; Secure // Rejected due to setting a Domain Set-Cookie: __Host-id=1; Secure; Path=/; Domain=example.com
Definition and Usage
The setcookie() function defines a cookie to be sent along with the rest of the HTTP headers.
A cookie is often used to identify a user. A cookie is a small file that the
server embeds on the user’s computer. Each time the same computer requests a
page with a browser, it will send the cookie too. With PHP, you can both create and retrieve cookie values.
The name of the cookie is automatically assigned to a variable of the same
name. For example, if a cookie was sent with the name «user», a variable is
automatically created called $user, containing the cookie value.
Note: The setcookie() function must appear BEFORE the <html> tag.
Note: The value of the cookie is automatically URLencoded when
sending the cookie, and automatically decoded when received (to prevent
URLencoding, use setrawcookie() instead).
Browser compatibility
The compatibility table in this page is generated from structured data. If you’d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome Full support Yes |
Edge Full support 12 |
Firefox Full support Yes |
IE Full support Yes |
Opera Full support Yes |
Safari Full support Yes |
WebView Android Full support Yes |
Chrome Android Full support Yes |
Firefox Android Full support Yes |
Opera Android Full support Yes |
Safari iOS Full support Yes |
Samsung Internet Android Full support Yes |
|
Chrome Full support 1 |
Edge Full support 12 |
Firefox Full support 3 |
IE Full support 9 |
Opera Full support 11 |
Safari Full support 5 |
WebView Android Full support 37 |
Chrome Android Full support Yes |
Firefox Android Full support 4 |
Opera Android Full support Yes |
Safari iOS Full support 4 |
Samsung Internet Android Full support Yes |
|
Chrome Full support Yes |
Edge Full support 12 |
Firefox Full support Yes |
IE Full support 8 |
Opera Full support Yes |
Safari Full support Yes |
WebView Android Full support Yes |
Chrome Android Full support Yes |
Firefox Android Full support Yes |
Opera Android Full support Yes |
Safari iOS Full support Yes |
Samsung Internet Android Full support Yes |
|
Chrome Full support 51 |
Edge Full support 16 |
Firefox Full support 60 |
IE No support No |
Opera Full support 39 |
Safari Full support 13 Notes |
WebView Android Full support 51 |
Chrome Android Full support 51 |
Firefox Android Full support 60 |
Opera Android Full support 41 |
Safari iOS Full support 13 |
Samsung Internet Android Full support 5.0 |
|
Chrome Full support 51 |
Edge Full support 16 |
Firefox Full support 60 |
IE No support No |
Opera Full support 39 |
Safari Full support 12 |
WebView Android Full support 51 |
Chrome Android Full support 51 |
Firefox Android Full support 60 |
Opera Android Full support 41 |
Safari iOS Full support 12.2 |
Samsung Internet Android Full support 5.0 |
|
: Defaults to |
Chrome Full support 80 |
Edge Full support 80 |
Firefox Full support 69 Disabled |
IE No support No |
Opera Full support 67 |
Safari No support No |
WebView Android Full support 80 |
Chrome Android Full support 80 |
Firefox Android No support No |
Opera Android No support No |
Safari iOS No support No |
Samsung Internet Android No support No |
Chrome Full support 51 |
Edge Full support 16 |
Firefox Full support 60 |
IE No support No |
Opera Full support 39 |
Safari Full support 13 Notes |
WebView Android Full support 51 |
Chrome Android Full support 51 |
Firefox Android Full support 60 |
Opera Android Full support 41 |
Safari iOS Full support 13 |
Samsung Internet Android Full support 5.0 |
|
Chrome Full support 51 |
Edge Full support 16 |
Firefox Full support 60 |
IE No support No |
Opera Full support 39 |
Safari Full support 12 |
WebView Android Full support 51 |
Chrome Android Full support 51 |
Firefox Android Full support 60 |
Opera Android Full support 41 |
Safari iOS Full support 12.2 |
Samsung Internet Android Full support 5.0 |
|
: Secure context required |
Chrome Full support 80 |
Edge Full support 80 |
Firefox Full support 69 Disabled |
IE No support No |
Opera Full support 67 |
Safari No support No |
WebView Android Full support 80 |
Chrome Android Full support 80 |
Firefox Android No support No |
Opera Android No support No |
Safari iOS No support No |
Samsung Internet Android No support No |
Cookie prefixes |
Chrome Full support 49 |
Edge Full support 79 |
Firefox Full support 50 |
IE No support No |
Opera Full support 36 |
Safari Full support Yes |
WebView Android Full support 49 |
Chrome Android Full support 49 |
Firefox Android Full support 50 |
Opera Android Full support 36 |
Safari iOS Full support Yes |
Samsung Internet Android Full support 5.0 |
Особенности работы протокола HTTP
Как вы узнали из прошлой главы, работа с веб-сайтами в интернете происходит по протоколу HTTP.
Это замечательный и простой протокол, который действует по схеме «запрос-ответ». То есть клиент (браузер) пользователя посылает на сервер запрос, состоящий, как правило, только из заголовков, а затем получает ответ в виде заголовков ответа и тела самого документа.
В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ».
Иными словами, сервер не «запоминает» клиентов; каждый запрос он обрабатывает с «чистого листа».
Для сервера нет никакой разницы: запросил один пользователь страницу десять раз или десять разных пользователей по разу. Для него все запросы одинаковые.
К счастью, протокол HTTP, а также все браузеры предоставляют возможность сохранения информации о пользователе.