Set cookie


Что такое куки (cookie)?

Куки — это небольшой объем данных, которые хранятся вэб браузером. Они позволяют Вам сохранять определенную информацию о пользователе и получать ее каждый раз, когда он посещает Вашу страницу. Каждый пользователь имеет свой собственный уникальный набор куков.

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

Свойство document.cookie.

В JavaScript куки доступны с помощью свойства cookie объекта document. Создать куки можно следующим образом:

   document.cookie = "name=значение; expires=дата; path=путь;   domain=домен; secure";  

… и получить весь сохраненый набор куков так:

   var x = document.cookie;  

Давайте рассмотрим сохранение и получение куков более подробно.

Сохранение куки

Для сохранения куки нужно присвоить document.cookie текстовую строку, которая содержит свойства куки, которые мы хотим создать:

   document.cookie = "name=значение; expires=дата; path=путь;   domain=домен; secure";  

Свойства описаны в таблице:


Свойство Описание Пример
name=значение Устанавливает имя куки и его значение. username=Вася
expires=дата Устанавливает дату истечения срока хранения куки. Дата должна быть представлена в формате, который возвращает метод toGMTString() объекта Date. Если значение expires не задано, куки будет удалено при закрытии браузера. expires=
13/06/2003 00:00:00
path=путь Данная опция устанавливает путь на сайте, в рамках которого действует куки. Получить значение куки могут только документы из указанного пути. Обычно данное свойство оставляют пустым, что означает что только документ установивший куки может получит доступ к нему. path=/demo/
domain=домен

Данная опция устанавливает домен, в рамках которого действует куки. Получить значение куки могут только сайты из указанного домена. Обычно данное свойство оставляют пустым, что означает, что только домен установивший куки может получит доступ к нему. domain=ruseller.com
secure Данная опция указывает браузеру, что для пересылки куки на сервер следует использовать SSL. Очень редко используется. secure

Давайте посмотрим пример установки куки:

   document.cookie = "username=Вася;   expires=15/02/2011 00:00:00";  

Данный код устанавливает куки username, и присваивает ему значение "Вася", которое будет храниться до 15-го февраля 2011 года (используется Европейский формат времени!).

   var cookie_date = new Date ( 2003, 01, 15 );  document.cookie = "username=Вася;   expires=" + cookie_date.toGMTString();  

Данный код выполняет точно такое же действие, как и предыдущий пример, но для установки даты используется метод Date.toGMTString(). Учтите, что нумерация месяца в объекте Date начинается с 0, то есть февраль — это 01.

   document.cookie = "logged_in=yes";  

Данный код устанавливает куки logged_in, и присваивает ему значение "yes"


. Так как атрибут expires не установлен, то куки удалится при закрытии браузера.

   var cookie_date = new Date ( ); // Текущая дата и время  cookie_date.setTime ( cookie_date.getTime() - 1 );  document.cookie = "logged_in=;   expires=" + cookie_date.toGMTString();  

Данный код устанавливает куки logged_in и присваивает строку хранения значение времени за одну секунду перед текущим - такая операция приведет к немедленному удалению куки. Ручной способ удалить куки!

Перекодирование значения куки!

Следует перекодировать значение куки для корректного хранения и отображения таких символов как пробел и двоеточие. Такая операция гарантирует, что браузер корректно воспримет значение. Перекодирование лекго выполняется функцией JavaScript escape(). Например:

   document.cookie = "username=" + escape("Вася Пупкин")   + "; expires=15/02/2003 00:00:00";  

Функция для установки куки

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

   function set_cookie ( name, value, exp_y, exp_m, exp_d, path, domain, secure )  {   var cookie_string = name + "=" + escape ( value );      if ( exp_y )   {   var expires = new Date ( exp_y, exp_m, exp_d );   cookie_string += "; expires=" + expires.toGMTString();   }      if ( path )   cookie_string += "; path=" + escape ( path );      if ( domain )   cookie_string += "; domain=" + escape ( domain );      if ( secure )   cookie_string += "; secure";      document.cookie = cookie_string;  }    

Функция получает данные для куки в качестве аргументов, затем строит соответствующую строку и устанавливает куки.

Например, установка куки без срока хранения:

   set_cookie ( "username", "Вася Пупкин" );  

Установка куки со сроком хранения до 15 февраля 2011:

   set_cookie ( "username", "Вася Пупкин", 2011, 01, 15 );  

Установка куки со сроком хранения, доменом ruseller.com, использованием SSL, но без пути:

   set_cookie ( "username", "Вася Пупкин", 2003, 01, 15, "",   "ruseller.com", "secure" );  

Функция для удаления куки.

Другая полезная функция для работы с куки представлена ниже. Функция «удаляет» куки из браузера посредством установки срока хранения на одну секунду раньше текущего значения времени.

   function delete_cookie ( cookie_name )  {   var cookie_date = new Date ( ); // Текущая дата и время   cookie_date.setTime ( cookie_date.getTime() - 1 );   document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();  }  

Для использования данной функции нужно только передать ей имя удаляемого куки:

   delete_cookie ( "username" );    

Получение значения куки

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

   var x = document.cookie;  

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

   "username=Вася; password=abc123"  

В данном примере 2 куки, которые были предварительно установлены: username, который имеет значение "Вася", и password, который имеет значение "abc123".

Функция для получения значения куки

Обычно, нам нужно только значение одного куки за один раз. Поэтому строка куки не удобна для использования! Здесь приводится функция, которая обрабатывает строку document.cookies, возвращет только то куки, которое представляет интерес в конкретный момент:

   function get_cookie ( cookie_name )  {   var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)' );      if ( results )   return ( unescape ( results[2] ) );   else   return null;  }  

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


для перекодирования к нормальному символьному виду. (Если куки не найдено, возвращается значение null.)

Данная функция проста в использовании. Например, для возврата значения куки username:

   var x = get_cookie ( "username" );  

Простой пример использования

В данном примере мы сделали страницу, которая запрашивает Ваше имя при первом посещении, затем она сохраняет Ваше имя в куки и показывает его при следующих посещениях.

Откройте страницу в новом окне. При первом посещении она попросит ввести имя и сохранит его в куки. Если Вы посетите страницу еще раз, она отобразит на экране введенное имя из куки.

Для куки задаем срок хранения в 1 год от текущей даты, это означает, что браузер сохранит Ваше имя даже если Вы закроете его.

Вы можете удалить куки нажав на ссылку Забудь обо мне!, которая вызывает функцию delete_cookie() и обновляет страницу, чтобы снова запросить имя у Вас.

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

   if ( ! get_cookie ( "username" ) )  {   var username = prompt ( "Пожалуйста, введите Ваше имя", "" );      if ( username )   {   var current_date = new Date;   var cookie_year = current_date.getFullYear ( ) + 1;   var cookie_month = current_date.getMonth ( );   var cookie_day = current_date.getDate ( );   set_cookie ( "username", username, cookie_year, cookie_month, cookie_day );   }  }  else  {   var username = get_cookie ( "username" );   document.write ( "Привет, " + username + ", добро пожаловать на страницу!" );   document.write ( "<br><a href="javascript:delete_cookie('username');   document.location.reload ( );">   Forget about me!</a>" );  }    

Данный урок показал Вам, как использовать куки в JavaScript для хранения информации о Ваших посетителях. Спасибо за внимание! 🙂

ruseller.com

1. Set cookie through PHP and get through JavaScript

<?php //Page: set_cookie.php //$_SERVER['HTTP_HOST'] = 'http://www.example.com '; // localhost create problem on IE so this line // to get the top level domain $myDomain = ereg_replace("^[^.]*.([^.]*).(.*)$", '1.2', $_SERVER['HTTP_HOST']); $setDomain = ($_SERVER['HTTP_HOST']) != "localhost" ? ".$myDomain" : false; setcookie ("site", 'http://only-your-views.blogspot.com', time()+3600*24*(2), '/', "$setDomain", 0 ); // You can change (2) to any negative value (-2) for deleting it. It is number of days for cookie to keep live. Any -ve number will tell browser that it is useless now. ?>

(In ereg_replace, double quote is not required but for some reason it was not visible on page. So used double quite.)

Page: get_cookie.html

<script> function readCookie(name) { 	var cookiename = name + "="; 	var ca = document.cookie.split(';'); 	for(var i=0;i < ca.length;i++) 	{ 		var c = ca[i]; 		while (c.charAt(0)==' ') c = c.substring(1,c.length); 		if (c.indexOf(cookiename) == 0) return c.substring(cookiename.length,c.length); 	} 	return null; } document.write("n" + readCookie('site')); </script>  

2. Set cookie through JavaScript and get through PHP

Page: set_cookie.html

<script> document.cookie = 'name=David' ; </script> Page: get_cookie.php <?php var_dump($_COOKIE['name']); ?>

3. Set cookie through JavaScript and get through JavaScript

<script type="text/javascript"> days = 3; // -ve for deleting it. var date = new Date(); date.setTime(date.getTime ()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); document.cookie = 'language=ruby' + expires; function readCookie(name) { 	var cookiename = name + "="; 	var ca = document.cookie.split(';'); 	for(var i=0;i < ca.length;i++) 	{ 		var c = ca[i]; 		while (c.charAt(0)==' ') c = c.substring(1,c.length); 		if (c.indexOf(cookiename) == 0) return c.substring(cookiename.length,c.length); 	} 	return null; } // refresh the page for getting the value or use this line in another page document.write("n" + readCookie('language')); </script>  

4. Set cookie through PHP and get through PHP

<?php //$_SERVER['HTTP_HOST'] = 'http://www.example.com '; // localhost create problem on IE so this line // to get the top level domain $myDomain = ereg_replace('^[^.]*.([^.]*).(.*)$', '1.2', $_SERVER['HTTP_HOST']); $setDomain = ($_SERVER['HTTP_HOST']) != "localhost" ? ".$myDomain" : false; setcookie ("site2", 'http://only-your-views.blogspot.com', time()+3600*24*(2), '/', "$setDomain", 0 ); echo @$_COOKIE ['site2']; ?>

5. Set the Array Cookies

<?php setcookie("cookie1[0]", "cookiethree"); setcookie("cookie1[1]", "cookietwo"); setcookie("cookie1[2]", "cookieone"); // after the page reloads, echo them out if (isset($_COOKIE['cookie1'])) { 	foreach ($_COOKIE['cookie1'] as $name => $value) 	{ 		echo "cookie1[$name] : $value <br />n"; 	} } ?>

6. Delete all Cookies through PHP

<?php foreach ($_COOKIE as $k=>$v) { 	if (is_array($_COOKIE[$k])) 	{ 		foreach ($_COOKIE[$k] as $key=>$val) 		{ 			setcookie($k.'['.$key.']',"", time()+3600*24*(-100)); 		} 	} 	setcookie($k,"", time()+3600*24*(-100)); } ?>

Few facts about Cookie:

Expire time is dependent of Client time. So, remember to check your geo location and your visitors geo location.


If you do not specify expiry date for cookie then it will available, until browser is closed.

Path for cookie is the current directory by default.

In PHP, cookie must be sent before any output to client.

In PHP setcookie function accepts argument like this:

True/False Setcookie (name, value, expire, path, domain, secure)

Path = ‘/’ will set cookie for entire domain. Path = ‘foo’ will set it for foo directory and subdirectory of ‘/foo/’.

Httponly is last parameter added in PHP 5.2.0 in setcookie (), but not supported by all browsers.

For deleting cookie, you will set cookie again but with days with negative values.

www.satya-weblog.com

Что такое cookie

Файлы cookie — это небольшие текстовые файлы, которые создаёт браузер в специальной папке по команде PHP программы. Хотя cookie может создать и JavaScript, но в этой статье не об этом. Тут мы будем говорить только о установке cookie через PHP программу.

Файлы cookie содержать в себе информацию в виде пар имя=значение. Например, в cookie можно записать логин и пароль пользователя и хранить их на компьютере клиента, чтобы он в следующий раз не залогинивался заново. Конечно, хранение логина и пароля в cookie не самый безопасный способ, и эти данные лучше хранить используя сессии в PHP, но в качестве примера использования cookie этот случай подойдёт.

PHP программа даёт команду браузеру-клиенту установить cookie используя строку в заголовке ответа. То есть вы должны представлять, как работает интернет, что такое заголовок запроса и заголовок ответа, чтобы понять как работает установка cookie.

Итак, всю информацию о том, какие cookie должен установить браузер, PHP программа отправляет в заголовке ответа.

На самом деле всё очень просто, читаем дальше и смотрим примеры.

Установка cookie в PHP

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

Все заголовки, которые создаёт ваш скрипт, должны быть отправлены до того, как ваш скрипт что-то выведет в окно браузера.

Вернёмся к нашей функции. Вот её синтаксис:

bool setcookie (  string имя,  string значение,  int время жизни,  string путь,  string домен,  bool протокол,  bool http only ) 

bool, string, int в этом синтаксисе ‐ это типы данных. То есть «bool setcookie()» обозначает то, что функций setcookie() возвращает значение булевого типа. Далее, первый и второй аргумент (имя и значение) должны быть типа строка (string), и так далее.

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

  • string имя — имя в паре имя=значение
  • string значение — значение в паре имя=значение
  • int время жизни — время хранения cookie, это метка времени Unix, т.е. желательно задавать это время с помощью функции time(), прибавляя время в секундах, через которое срок действия cookie должен истечь. Также можно воспользоваться функцией mktime().
  • string путь — путь к директории на сервере, из которой будут доступны cookie.
  • string домен — домен, которому доступны cookie.
  • bool протокол — указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE, cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера.
  • bool http only — если задано TRUE, cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE.

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

Вот пример установки cookie:

<?php setcookie("message", "welcome", time() + 60); echo "cookie установлены";

Этот пример только устанавливает cookie на компьютер клиента.

Далее мы рассмотрим более содержательные примеры.

Получение cookie в PHP

В прошлом примере мы отправили браузеру команду создать cookie. Теперь он их создал, и когда в следующий раз браузер отправит запрос серверу, то он передаст содержимое cookie в заголовке запроса.

В PHP-програннме можно определить, прислал браузер cookie или нет очень просто. Они доступны в массиве $_COOKIE.

Давайте усложним прошлый пример:

<?php setcookie("message", "welcome", time() + 60); echo "cookie установлены. Приветствие: $_COOKIE[message]"; echo "<pre>"; print_r($_COOKIE); echo "</pre>";

Когда вы откроете страницу примера в первый раз, то за приветствием ничего не будет. Это потомы что cookie положены на ваш компьютер, но серверу ещё не отправлены.

Хотя в массиве $_COOKIE уже может что-то быть, но тогда эти cookie ложит не наш пример.

Только обновив страницу второй раз вы увидите, что PHP программа получила пару $_COOKIE[message] => welcome.

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

Пожалуй вот и всё что касается получения доступа к информации из cookie в PHP.

Удаление cookie в PHP

Чтобы удалить cookie нужно просто поставить их срок жизни в прошедшем времени.

<?php setcookie("message", "welcome", time() - 60*60*24*32); echo "cookie удалены"; ?>

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

Пример работы cookie в PHP

Напишем примитивный счётчик просмотра страниц сайта посетителем, используя cookie.

<?php if (!$_COOKIE[counter]) $counter = 1; else $counter = ++$_COOKIE['counter']; setcookie("counter", $counter, time() + 60); echo "Визит страницы: $counter"; 

Обратите внимание, что данные в этом примере живут 60 секунд, потом счётчик обнулится.

На этом тема работа с cookie в PHP раскрыта практически полностью.

Далее нужно изучать сессии в PHP.

komotoz.ru

Синтаксис

Set-Cookie: <cookie-name>=<cookie-value>  Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value> Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value> Set-Cookie: <cookie-name>=<cookie-value>; Secure Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly  Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax  // Multiple directives are also possible, for example: Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly 

Директивы

<cookie-name>=<cookie-value>
Файл cookie начинается с пары имя-значение:

  • <cookie-name> могут быть любыми символами US-ASCII, кроме управляющих символов (CTL), пробелов или вкладок. Он также не должен содержать разделительный символ, такой как: () <> @,; знак равно
  • Значение <cookie-value> может быть задано в двойных кавычках, и любые символы US-ASCII, исключая CTL, пробелы, двойные кавычки, запятую, точку с запятой и обратную косую черту, разрешены. Кодирование . Многие реализации выполняют кодировку URL-адресов по значениям cookie, однако это не требуется в спецификации RFC. Это помогает удовлетворять требованиям, по которым символы допустимы для <cookie-value>.
  • __Secure- : Cookies с именем, начинающимся с __Secure- (тире является частью префикса) должны быть установлены с помощью secure флага и должны быть с защищенной страницы (HTTPS).
  • __Host- : Cookies с именем, начинающимся с __Host- должны быть установлены с secure флагом, должны быть с защищенной страницы (HTTPS), не должны иметь указанный домен (и, следовательно, не отправляться на поддомены), и путь должен быть «/».
Expires = <date> Дополнительно

Максимальное время жизни файла cookie как метка даты HTTP-даты. См. « Date для подробного формата. Если не указано, cookie будет иметь время существования cookie сеанса. Сеанс завершается, когда клиент закрыт, что означает, что куки сеанса будут удалены в этот момент. Однако у многих веб-браузеров есть функция, называемая восстановлением сеанса, которая сохранит все ваши вкладки и вернет их при следующем использовании браузера. Cookies также будут присутствовать, и это похоже на то, что вы никогда не закрывали браузер.

Когда установлена ​​дата истечения срока действия, время и дата установлены относительно клиента, на котором установлен cookie, а не на сервере.

Max-Age = <число> Дополнительно
Количество секунд до истечения срока действия файла cookie. Нулевое или отрицательное число немедленно истечет. Старые браузеры (т.е. 6, т. Е. 7 и т. Д.) Не поддерживают максимальный возраст. Для других браузеров, если установлены оба параметра ( Expires и Max-Age ), Max-Age будет иметь приоритет.
Домен = <домен-значение> Необязательный
Указывает те узлы, на которые будет отправляться файл cookie. Если не указано, по умолчанию используется хост-часть текущего местоположения документа (но не включает поддомены). Вопреки более ранним спецификациям, ведущие точки в именах доменов игнорируются. Если домен указан, субдомены всегда включены.
Path = <путь-значение> Необязательный
Указывает путь URL, который должен существовать в запрошенном ресурсе перед отправкой заголовка Cookie. Символ% x2F («/») интерпретируется как разделитель каталогов, и подкаталоги также будут сопоставляться (например, path = / docs, «/ docs», «/ docs / Web /» или «/ docs / Web / HTTP «все будет согласовано).
Безопасный дополнительный
Безопасный файл cookie будет отправлен на сервер только тогда, когда запрос будет выполнен с использованием протокола SSL и протокола HTTPS. Однако конфиденциальная или конфиденциальная информация никогда не должна храниться или передаваться в HTTP-файлах cookie, поскольку весь механизм по своей сути небезопасен, и это не означает, что любая информация зашифровывается, например.

Примечание. Небезопасные сайты ( http: 🙂 больше не могут устанавливать файлы cookie с «защищенной» директивой (новые в Chrome 52+ и Firefox 52+).

HttpOnly Дополнительно
Куки HTTP-only недоступны через JavaScript через свойство Document.cookie , XMLHttpRequest и API Request для смягчения атак на межсайтовый скриптинг ( XSS ).
SameSite = Строгое
SameSite = Lax Дополнительно

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

Примеры

Файлы cookie сеанса удаляются при закрытии клиента. Они не указывают директивы Expires или Max-Age . Обратите внимание, что веб-браузер часто включал восстановление сеанса.

Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/

Вместо того, чтобы истекать, когда клиент закрыт, постоянные файлы cookie истекают в определенную дату ( Expires ) или через определенный период времени ( Max-Age ).

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly 

Недопустимые домены

Куки-файлы, принадлежащие домену, который не включает исходный сервер, должны быть отклонены пользовательским агентом . Следующий файл cookie будет отклонен, если он был установлен сервером, размещенным на сайте originalcompany.com.

Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk; Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT

Имена файлов cookie с префиксами __Secure- и __Host- могут использоваться только в том случае, если они установлены с secure директивой из безопасного (HTTPS) источника. Кроме того, файлы cookie с префиксом __Host- должны иметь путь «/» (весь хост) и не должны иметь атрибут домена. Для клиентов, которые не используют префиксы cookie, вы не можете рассчитывать на получение этих дополнительных заверений, и файлы cookie всегда будут приняты.

// 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 directive Set-Cookie: __Secure-id=1  // Rejected due to the missing Path=/ directive Set-Cookie: __Host-id=1; Secure  // Rejected due to setting a domain Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com 

Замечания по совместимости

  • Начиная с Chrome 52 и Firefox 52, небезопасные сайты ( http: не могут устанавливать файлы cookie с «защищенной» директивой.

code-examples.net

Мета тег Set-Cookie устанавливает cookie броузера.

Синтаксис

Атрибуты EXPIRES, DOMAIN, PATH и SECURE при необходимости можно опустить.

Параметры

NAME имя cookie, не может содержать символы перевода строки, пробелов, точки с запятой (;) и табуляции
EXPIRES время хранения cookie. После указанной даты (в формате "Wdy, DD-Mon-YYYY HH:MM:SS GMT") истекает время хранения cookie. если этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия броузера
DOMAIN домен, для которого задается значение cookie. Для доменов COM, EDU, NET, ORG, GOV, MIL, INT значение можно задавать сокращенно "MY.COM", оно будет распространяться и на домен "WWW.MY.COM". Для всех остальных (в том числе и RU) значение надо задавать полностью "WWW.MY.RU". Если этот атрибут опущен, то по умолчанию используется доменное имя сервера, с которого было выставлено значение cookie
PATH устанавливает подмножество документов, на которые распространяется действие cookie. При значение "/doc" действие cookie будет распространено на все файлы и каталоги в этой директории начинающееся на "doc" (/doc/, /document/, /doc2/, docs.html, doc-test.htm). Если этот атрибут опущен, то значение cookie распространяется только на документы директории, в которой расположен текущий документ
SECURE указывает, что информация о cookie должна пересылается через HTTPS (HTTP с использованием SSL). В противном случае информация о cookie будет пересылается по протоколу HTTP

Перед запросом к серверу, броузер проверяет cookie. И если атрибуты NAME, DOMAIN и PATH совпадают, броузер посылает cookie серверу. Если cookie принимает новое значение, старое значение удаляется. Броузер имеет ряд ограничений по работе с cookie:

  • Единовременно может храниться не более 300 значений cookie.
  • Cookie не может превышать 4 Кбайт.
  • От одного сервера (домена) не может быть более 20 cookie.

Эти ограничения могут быть несколько иными, в зависимости от настройки и типа броузера. Если происходит превышение лимита (общего или по домену) удаляется первая по времени запись. Удаление происходит, не зависимо от значения атрибута EXPIRES. При превышении 4 Кбайт, cookie усекается.

Примеры

xiper.net

Браузер передает куку

Зависит от времени жизни куки

Заметки (замечания) по кукам

Куки посылаются туда-сюда в заголовках.

‘Туда’ или в браузер кука посылается посредством – setcookie (установили), ‘обратно’ cookie (обратиться к кукам можно посредством массива $_COOKIE).

Сессионые(временные) куки: под сессией понимается то время, пока открыт браузер пользователя; как только браузер закроют, сессионная кука удалится. Если в setcookie не указать время — это сессионная кука (пока открыт браузер).

Куки посылаются в заголовках, поэтому они должны быть до любого вывода.

Сейчас куки используются в основном для отслеживания посещаемости(то есть не массово) и т.д.

Следующая сессионая кука считает количество посещения и выводит дату последнего визита.

PHP

 if(isset($_COOKIE["count"]))   {   setcookie('count',(int) ++$_COOKIE["count"]);   }   else   {   setcookie('count',0);   }  //----------------------------------------------------------   if(isset($_COOKIE["data"]))   {   $data = date('Y - F - d - H - i - s');   setcookie('data', $data );   }   else   {   setcookie('data', date('Y - F - d - H - i - s') );   }

dnzl.ru

Формат и синтаксис Cookie

Андрей Аликберов, ЦИТ

  • Спецификация
  • Синтаксис HTTP заголовка для поля Cookie
  • Дополнительные сведения
  • Примеры

Спецификация

Полное описание поля Set-Cookie HTTP заголовка:

   Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure  

Минимальное описание поля Set-Cookie HTTP заголовка:

   Set-Cookie: NAME=VALUE;  

NAME=VALUE — строка символов, исключая перевод строки, запятые и пробелы. NAME-имя cookie, VALUE — значение.

expires=DATE — время хранения cookie, т.е. вместо DATE должна стоять дата в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT, после которой истекает время хранения cookie. Если этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия броузера.

domain=DOMAIN_NAME — домен, для которого значение cookie действительно. Например, domain=cit-forum.com. В этом случае значение cookie будет действительно и для сервера cit-forum.com, и для www.cit-forum.com. Но не радуйтесь, указания двух последних периодов доменных имен хватает только для доменов иерархии "COM", "EDU", "NET", "ORG", "GOV", "MIL", и "INT". Для доменов иерархии "RU" придется указывать три периода.

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

path=PATH — этот атрибут устанавливает подмножество документов, для которых действительно значание cookie. Например, указание path=/win приведет к тому, что значение cookie будет действительно для множества документов в директории /win/, в директории /wings/ и файлов в текущей директории с именами типа wind.html и windows.shtml

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

secure — если стоит такой маркер, то информация cookie пересылается только через HTTPS (HTTP с использованием SSL). Если этот маркер не указан, то информация пересылается обычным способом.

Синтаксис HTTP заголовка для поля Cookie

Когда запрашивается документ с HTTP сервера, броузер проверяет свои cookie на предмет соответствия домену сервера и прочей информации. В случае, если найдены удовлетворяющие всем условиям значения cookie броузер посылает их в серверу в виде пары имя/значение:

   Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...  

Дополнительные сведения

В случае, если cookie принимает новое значение при имеющемся уже в броузере cookie с совпадающими NAME, domain и path, старое значение затирается новым. В остальных случаях новые cookies добавляются.

Использование expires не гарантирует сохранность cookie в течение заданного периода времени, поскольку клиент (броузер) может удалить запись вследствие нехватки выделенного места или каких-либо других лимитов.

Клиент (броузер) имеет следующие ограничения:

  • всего может храниться до 300 значений cookies
  • каждый cookie не может превышать 4Кбайт
  • с одного сервера или домена может храниться до 20 значений cookie

Если ограничение 300 или 20 превышается, то удаляется первая по времени запись. При превышении 4К — корректность такого cookie страдает — отрезается кусок записи (с начала этой записи) равный превышению.

В случае кэширования документов, например, proxy-сервером, поле Set-cookie HTTP заголовка никогда не кэшируется.

Если proxy-сервер принимает ответ, содержащий поле Set-cookie в заголовке, предполагается, что поле таки доходит до клиента вне зависимости от статуса 304 (Not Modified) или 200 (OK).

Соответственно, если клиентский запрос содержит в заголовке Cookie, то он должен дойти до сервера, даже если установлен If-modified-since.

    Я полагаю, что все что сказано про proxy не относится к случаю, когда cookie устанавливается жестко с помощью META-тагов.

Примеры

Ниже приведено несколько примеров, иллюстрирующих использование cookies

Первый пример:

Клиент запрашивает документ и принимает ответ:

   Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT  

Когда клиент запрашивает URL с путем "/" на этом сервере, он посылает:

   Cookie: CUSTOMER=WILE_E_COYOTE  

Клиент запрашивает документ и принимает ответ:

   Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/  

Когда клиент запрашивает URL с путем "/" на этом сервере, он посылает:

   Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001  

Клиент получает:

   Set-Cookie: SHIPPING=FEDEX; path=/foo  

Когда клиент запрашивает URL с путем "/" на этом сервере, он посылает:

   Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001  

Когда клиент запрашивает URL с путем "/foo" на этом сервере, он посылает:

   Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX  

Второй пример:

Клиент принимает:

   Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/  

Когда клиент запрашивает URL с путем "/" на этом сервере, он посылает:

   Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001  

Клиент принимает:

   Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo  

Когда клиент запрашивает URL с путем "/ammo" на этом сервере, он посылает:

   Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001  

Комментарий: здесь мы имеем две пары имя/значение с именем "PART_NUMBER".
Это наследие из предыдущего примера, где значение для пути "/" прибавилось к значению для "/ammo".

citforum.ru

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

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

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

<?php setcookie('foo','bar1'); header('Set-cookie: foo1=bar11'); ?> 

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

Обратимся к первоисточнику — HTTP-ответу веб-сервера:
image

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

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

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

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

Это очень печально. И забавно с другой стороны.
При получении в НТТР-ответе сервера
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

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

setcookie('foo','bar1'); 

и

header('Set-cookie: foo1=bar11'); 

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

Помните об этом!

habr.com


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.