Перейти к содержимому

Как сделать куки на сайте

  • автор:

Куки, document.cookie

Куки – это небольшие строки данных, которые хранятся непосредственно в браузере. Они являются частью HTTP-протокола, определённого в спецификации RFC 6265.

Куки обычно устанавливаются веб-сервером при помощи заголовка Set-Cookie . Затем браузер будет автоматически добавлять их в (почти) каждый запрос на тот же домен при помощи заголовка Cookie .

Один из наиболее частых случаев использования куки – это аутентификация:

  1. При входе на сайт сервер отсылает в ответ HTTP-заголовок Set-Cookie для того, чтобы установить куки со специальным уникальным идентификатором сессии («session identifier»).
  2. Во время следующего запроса к этому же домену браузер посылает на сервер HTTP-заголовок Cookie .
  3. Таким образом, сервер понимает, кто сделал запрос.

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

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

Чтение из document.cookie

Хранит ли ваш браузер какие-то куки с этого сайта? Посмотрим:

// На javascript.info мы используем сервис Google Analytics для сбора статистики, // поэтому какие-то куки должны быть alert( document.cookie ); // cookie1=value1; cookie2=value2;. 

Значение document.cookie состоит из пар ключ=значение , разделённых ; . Каждая пара представляет собой отдельное куки.

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

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

Запись в document.cookie

Мы можем писать в document.cookie . Но это не просто свойство данных, а акcессор (геттер/сеттер). Присваивание к нему обрабатывается особым образом.

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

Например, этот вызов установит куки с именем user и значением John :

document.cookie = "user=John"; // обновляем только куки с именем 'user' alert(document.cookie); // показываем все куки

Если вы запустите этот код, то, скорее всего, увидите множество куки. Это происходит, потому что операция document.cookie= перезапишет не все куки, а лишь куки с вышеупомянутым именем user .

Технически, и имя и значение куки могут состоять из любых символов, для правильного форматирования следует использовать встроенную функцию encodeURIComponent :

// специальные символы (пробелы), требуется кодирование let name = "my name"; let value = "John Smith" // кодирует в my%20name=John%20Smith document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); alert(document.cookie); // . ; my%20name=John%20Smith

Ограничения

Существует несколько ограничений:

  • После encodeURIComponent пара name=value не должна занимать более 4Кб. Таким образом, мы не можем хранить в куки большие данные.
  • Общее количество куки на один домен ограничивается примерно 20+. Точное ограничение зависит от конкретного браузера.

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

Эти настройки указываются после пары ключ=значение и отделены друг от друга разделителем ; , вот так:

document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"

path

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

Если куки установлено с path=/admin , то оно будет доступно на страницах /admin и /admin/something , но не на страницах /home или /adminpage .

Как правило, указывают в качестве пути корень path=/ , чтобы наше куки было доступно на всех страницах сайта.

domain

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

Нет никакого способа разрешить доступ к файлам куки из другого домена 2-го уровня, поэтому other.com никогда не получит куки, установленный по адресу site.com .

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

По умолчанию куки доступны лишь тому домену, который его установил.

Пожалуйста, обратите внимание, что по умолчанию файл куки также не передаётся поддомену, например forum.site.com .

// если мы установим файл куки на веб-сайте site.com. document.cookie = "user=John" // . мы не увидим его на forum.site.com alert(document.cookie); // нет user

…Но это можно изменить. Если мы хотим разрешить поддоменам типа forum.site.com получать куки, установленные на site.com , это возможно.

Чтобы это произошло, при установке файла куки в site.com , мы должны явно установить параметр domain для корневого домена: domain=site.com . После этого все поддомены увидят такой файл cookie.

// находясь на странице site.com // сделаем куки доступным для всех поддоменов *.site.com: document.cookie = "user=John; domain=site.com" // позже // на forum.site.com alert(document.cookie); // есть куки user=John

По историческим причинам установка domain=.site.com (с точкой перед site.com ) также работает и разрешает доступ к куки для поддоменов. Это старая запись, но можно использовать и её, если нужно, чтобы поддерживались очень старые браузеры.

Таким образом, опция domain позволяет нам разрешить доступ к куки для поддоменов.

expires, max-age

По умолчанию, если куки не имеют ни одного из этих параметров, то они удалятся при закрытии браузера. Такие куки называются сессионными («session cookies»).

Чтобы помочь куки «пережить» закрытие браузера, мы можем установить значение опций expires или max-age .

  • expires=Tue, 19 Jan 2038 03:14:07 GMT

Дата истечения срока действия куки, когда браузер удалит его автоматически.

Дата должна быть точно в этом формате, во временной зоне GMT. Мы можем использовать date.toUTCString , чтобы получить правильную дату. Например, мы можем установить срок действия куки на 1 день.

// +1 день от текущей даты let date = new Date(Date.now() + 86400e3); date = date.toUTCString(); document.cookie = "user=John; expires=" + date;

Если мы установим в expires прошедшую дату, то куки будет удалено.

Альтернатива expires , определяет срок действия куки в секундах с текущего момента.

Если задан ноль или отрицательное значение, то куки будет удалено:

// куки будет удалено через 1 час document.cookie = "user=John; max-age=3600"; // удалим куки (срок действия истекает прямо сейчас) document.cookie = "user=John; max-age=0";

secure

Куки следует передавать только по HTTPS-протоколу.

По умолчанию куки, установленные сайтом http://site.com , также будут доступны на сайте https://site.com и наоборот.

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

С этой настройкой, если куки будет установлено на сайте https://site.com , то оно не будет доступно на том же сайте с протоколом HTTP, как http://site.com . Таким образом, если в куки хранится конфиденциальная информация, которую не следует передавать по незашифрованному протоколу HTTP, то нужно установить этот флаг.

// предполагается, что сейчас мы на https:// // установим опцию secure для куки (куки доступно только через HTTPS) document.cookie = "user=John; secure";

samesite

Это ещё одна настройка безопасности, применяется для защиты от так называемой XSRF-атаки (межсайтовая подделка запроса).

Чтобы понять, как настройка работает и где может быть полезной, посмотрим на XSRF-атаки.

Атака XSRF

Представьте, вы авторизовались на сайте bank.com . То есть: у вас есть куки для аутентификации с этого сайта. Ваш браузер отправляет его на сайт bank.com с каждым запросом, чтобы сервер этого сайта узнавал вас и выполнял все конфиденциальные финансовые операции.

Теперь, просматривая веб-страницу в другом окне, вы случайно переходите на сайт evil.com , который автоматически отправляет форму на сайт bank.com с заполненными полями, которые инициируют транзакцию на счёт хакера.

Браузер посылает куки при каждом посещении bank.com , даже если форма была отправлена с evil.com . Таким образом, банк узнает вас и выполнит платёж.

Такая атака называется межсайтовая подделка запроса (или Cross-Site Request Forgery, XSRF).

Конечно же, в реальной жизни банки защищены от такой атаки. Во всех сгенерированных сайтом bank.com формах есть специальное поле, так называемый «токен защиты от xsrf», который вредоносная страница не может ни сгенерировать, ни каким-либо образом извлечь из удалённой страницы (она может отправить форму туда, но не может получить данные обратно). И сайт bank.com при получении формы проверяет его наличие.

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

Настройка samesite

Параметр куки samesite предоставляет ещё один способ защиты от таких атак, который (теоретически) не должен требовать «токенов защиты xsrf».

У него есть два возможных значения:

  • samesite=strict (или, что то же самое, samesite без значения)

Куки с samesite=strict никогда не отправятся, если пользователь пришёл не с этого же сайта.

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

Если куки имеют настройку samesite , то атака XSRF не имеет шансов на успех, потому что отправка с сайта evil.com происходит без куки. Таким образом, сайт bank.com не распознает пользователя и не произведёт платёж.

Защита довольно надёжная. Куки с настройкой samesite будет отправлено только в том случае, если операции происходят с сайта bank.com , например отправка формы сделана со страницы на bank.com .

Хотя есть небольшие неудобства.

Когда пользователь перейдёт по ссылке на bank.com , например из своих заметок, он будет удивлён, что сайт bank.com не узнал его. Действительно, куки с samesite=strict в этом случае не отправляется.

Мы могли бы обойти это ограничение, используя два куки: одно куки для «общего узнавания», только для того, чтобы поздороваться: «Привет, Джон», и другое куки для операций изменения данных с samesite=strict . Тогда пользователь, пришедший на сайт, увидит приветствие, но платежи нужно инициировать с сайта банка, чтобы отправилось второе куки.

Это более мягкий вариант, который также защищает от XSRF и при этом не портит впечатление от использования сайта.

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

Куки с samesite=lax отправляется, если два этих условия верны:

  1. Используются безопасные HTTP-методы (например, GET, но не POST). Полный список безопасных HTTP-методов можно посмотреть в спецификации RFC7231. По сути, безопасными считаются методы, которые обычно используются для чтения, но не для записи данных. Они не должны выполнять никаких операций на изменение данных. Переход по ссылке является всегда GET-методом, то есть безопасным.
  2. Операция осуществляет навигацию верхнего уровня (изменяет URL в адресной строке браузера). Обычно это так, но если навигация выполняется в , то это не верхний уровень. Кроме того, JavaScript-методы для сетевых запросов не выполняют никакой навигации, поэтому они не подходят.

Таким образом, режим samesite=lax , позволяет самой распространённой операции «переход по ссылке» передавать куки. Например, открытие сайта из заметок удовлетворяет этим условиям.

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

Если это вам подходит, то добавление samesite=lax , скорее всего, не испортит впечатление пользователей от работы с сайтом и добавит защиту.

В целом, samesite отличная настройка.

Но у неё есть важный недостаток:

  • samesite игнорируется (не поддерживается) старыми браузерами, выпущенными до 2017 года и ранее.

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

Но мы, безусловно, можем использовать samesite вместе с другими методами защиты, такими как XSRF-токены, чтобы добавить дополнительный слой защиты, а затем, в будущем, когда старые браузеры полностью исчезнут, мы, вероятно, сможем полностью удалить XSRF-токены.

httpOnly

Эта настройка не имеет ничего общего с JavaScript, но мы должны упомянуть её для полноты изложения.

Веб-сервер использует заголовок Set-Cookie для установки куки. И он может установить настройку httpOnly .

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

Эта настройка используется в качестве меры предосторожности от определённых атак, когда хакер внедряет свой собственный JavaScript-код в страницу и ждёт, когда пользователь посетит её. Это вообще не должно быть возможным, хакер не должен быть в состоянии внедрить свой код на ваш сайт, но могут быть ошибки, которые позволят хакеру сделать это.

Обычно, если такое происходит, и пользователь заходит на страницу с JavaScript-кодом хакера, то этот код выполняется и получает доступ к document.cookie , и тем самым к куки пользователя, которые содержат аутентификационную информацию. Это плохо.

Но если куки имеет настройку httpOnly , то document.cookie не видит его, поэтому такое куки защищено.

Приложение: Функции для работы с куки

Вот небольшой набор функций для работы с куки, более удобных, чем ручная модификация document.cookie .

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

getCookie(name)

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

Функция getCookie(name) возвращает куки с указанным name :

// возвращает куки с указанным name, // или undefined, если ничего не найдено function getCookie(name) < let matches = document.cookie.match(new RegExp( "(?:^|; )" + name.replace(/([\.$?*|<>\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" )); return matches ? decodeURIComponent(matches[1]) : undefined; >

Здесь new RegExp генерируется динамически, чтобы находить ; name= .

Обратите внимание, значение куки кодируется, поэтому getCookie использует встроенную функцию decodeURIComponent для декодирования.

setCookie(name, value, options)

Устанавливает куки с именем name и значением value , с настройкой path=/ по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):

function setCookie(name, value, options = <>) < options = < path: '/', // при необходимости добавьте другие значения по умолчанию . options >; if (options.expires instanceof Date) < options.expires = options.expires.toUTCString(); >let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value); for (let optionKey in options) < updatedCookie += "; " + optionKey; let optionValue = options[optionKey]; if (optionValue !== true) < updatedCookie += "=" + optionValue; >> document.cookie = updatedCookie; > // Пример использования: setCookie('user', 'John', );

deleteCookie(name)

Чтобы удалить куки, мы можем установить отрицательную дату истечения срока действия:

function deleteCookie(name) < setCookie(name, "", < 'max-age': -1 >) >

Операции обновления или удаления куки должны использовать те же путь и домен

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

Приложение: Сторонние куки

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

  1. Страница site.com загружает баннер с другого сайта: .
  2. Вместе с баннером удалённый сервер ads.com может установить заголовок Set-Cookie с куки, например, id=1234 . Такие куки создаются с домена ads.com и будут видны только на сайте ads.com :

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

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

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

  • Safari вообще не разрешает сторонние куки.
  • У Firefox есть «чёрный список» сторонних доменов, чьи сторонние куки он блокирует.

На заметку:

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

Если скрипт устанавливает куки, то нет разницы откуда был загружен скрипт – куки принадлежит домену текущей веб-страницы.

Приложение: GDPR

Эта тема вообще не связана с JavaScript, но следует её иметь в виду при установке куки.

В Европе существует законодательство под названием GDPR, которое устанавливает для сайтов ряд правил, обеспечивающих конфиденциальность пользователей. И одним из таких правил является требование явного разрешения от пользователя на использование отслеживающих куки.

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

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

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

Есть два основных варианта как сайты следуют GDPR. Вы наверняка уже видели их в сети:

  1. Если сайт хочет установить куки для отслеживания только для авторизованных пользователей. То в регистрационной форме должен быть установлен флажок «принять политику конфиденциальности» (которая определяет, как используются куки), пользователь должен установить его, и только тогда сайт сможет использовать авторизационные куки.
  2. Если сайт хочет установить куки для отслеживания всем пользователям. Чтобы сделать это законно, сайт показывает модальное окно для пользователей, которые зашли в первый раз, и требует от них согласие на использование куки. Затем сайт может установить такие куки и показать пользователю содержимое страницы. Хотя это создаёт неудобства для новых посетителей – никому не нравится наблюдать модальные окна вместо контента. Но GDPR в данной ситуации требует явного согласия пользователя.

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

Итого

document.cookie предоставляет доступ к куки.

  • Операция записи изменяет только то куки, которое было указано.
  • Имя и значение куки должны быть закодированы.
  • Одно куки вмещает до 4kb данных, разрешается более 20 куки на сайт (зависит от браузера).
  • path=/ , по умолчанию устанавливается текущий путь, делает куки видимым только по указанному пути и ниже.
  • domain=site.com , по умолчанию куки видно только на текущем домене, если явно указан домен, то куки видно и на поддоменах.
  • expires или max-age устанавливает дату истечения срока действия, без них куки умрёт при закрытии браузера.
  • secure делает куки доступным только при использовании HTTPS.
  • samesite запрещает браузеру отправлять куки с запросами, поступающими извне, помогает предотвратить XSRF-атаки.
  • Сторонние куки могут быть запрещены браузером, например Safari делает это по умолчанию.
  • Установка отслеживающих куки пользователям из стран ЕС требует их явного согласия на это в соответствии с законодательством GDPR.

setcookie

Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):

setcookie ( string $name , string $value = «» , array $options = [] ): bool

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

После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST .

Список параметров

» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name

Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name , допустим, ‘cookiename’ , будет доступно через $_COOKIE[‘cookiename’] .

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Один из способов установить значение — добавить количество секунд до истечения срока действия cookie к результату вызова функции time() . Например, time()+60*60*24*30 установит, что срок действия cookie истекает через 30 дней. Другой вариант — использовать функцию mktime() . Если задать 0 или пропустить аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).

Замечание:

Можно заметить, что expires_or_options принимает в качестве значения метку времени 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.

Список изменений

Версия Описание
8.2.0 Формат даты отправляемых файлов cookie теперь ‘D, d M Y H:i:s \G\M\T’ ; ранее он был ‘D, d-M-Y H:i:s T’ .
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, заданные в предыдущих примерах:

// установка даты истечения срока действия на час назад
setcookie ( «TestCookie» , «» , time () — 3600 );
setcookie ( «TestCookie» , «» , time () — 3600 , «/~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» ;
>
>
?>

Результат выполнения этого примера:

three : cookiethree two : cookietwo one : cookieone

Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.

Примечания

Замечание:

Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

  • Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задаётся в параметре expires_or_options . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
  • При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку, а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение ‘deleted’ , а срок действия переносится на год в прошлое.
  • Так как установка значения false приведёт к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для false и 1 для true .
  • Cookie можно именовать, как массивы, и они будут доступны в PHP-скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имён и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

Смотрите также

  • header() — Отправка HTTP-заголовка
  • setrawcookie() — Отправляет cookie без URL-кодирования значения
  • раздел cookies
  • » RFC 6265
  • » RFC 2109

Что такое cookie файлы: зачем они нужны и как их удалить

Cookie («куки-файлы», в переводе с англ. «печенье») — это фрагмент данных, отправленные веб-сервером, которые хранятся в файле на компьютере пользователя, для его дальнейшей идентификации на этом сайте. Простым словами, cookie — это небольшой файл на компьютере, по которому сайт в последствии идентифицирует пользователя.

Пересылка cookie происходит при помощи браузера либо отправляется иным клиентом.

Схема обмена куками между сервером и клиентом

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

Присоединяйтесь к нашему Telegram-каналу!

  • Теперь Вы можете читать последние новости из мира интернет-маркетинга в мессенджере Telegram на своём мобильном телефоне.
  • Для этого вам необходимо подписаться на наш канал.

Откуда взялась технология cookie

Идея использовать куки в вебе принадлежит американскому программисту Лу Монтулли. Уже в 1994 году была актуальна проблема сохранения состояния транзакций: в процессе перемещения по сайту необходимо было фиксировать потенциально интересные пользователю товары.

Главный изобретатель «печенья» — американский программист Лу Монтулли

Именно Лу Монтулли догадался хранить эти данные на компьютере конечного пользователя. Первая спецификация куки была описана 13 октября 1994 года. Через год Монтулли подает заявку на патент, который в итоге и был выдан, но значительно позже — в 1998 году. СМИ узнали о куки в 1996 году: тогда технология была расценена как серьезная угроза конфиденциальности в интернете.

Изменилось ли что-то с тех пор? Давайте разбираться.

Читайте также:
Что такое robots.txt как его создать и правильно настроить

Как работают cookie

Чтобы отправить куки непосредственно с сервера в клиент, используется заголовок Set-Cookie. Выглядит он следующим образом:

В ответ браузер получит следующий ответ:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: red_cookie=chocolate
Set-Cookie: green_cookie=crunchberry
[контент страницы

Теперь браузер запомнил куки и при каждом последующем обращении к серверу вернет серверу их сохраненные версии:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: red_cookie=chocolate; green_cookie=crunchberry

Для чего нужны cookie

В течение последних десятилетий cookie используется для трех главных целей:

  1. Отслеживание поведения пользователя. Cookie-файлы увеличивают точность пользовательской истории и позволяют отслеживать запросы новых страниц. Благодаря cookie можно узнать, какие именно сайты открывал пользователь и как долго он находился на каждом из них.
  2. Управление сессиями на сайте. Именно благодаря файлам cookie вы можете отправить в корзину несколько товаров, закрыть сайт, позже вернуться и затем увидеть список сохраненных ранее товаров даже без регистрации на сайте. Также куки используются для авторизации на сайте.

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

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

Таким образом, все сценарии использования cookie можно свести к пяти:

  1. Сопоставление данных о пользователе.
  2. Проверка подлинности пользователя.
  3. Проверка состояния сессии.
  4. Сохранение пользовательских настроек.
  5. Сохранение пользовательских настроек.

Читайте также:
Что такое показатель отказов и как его снизить

Где хранятся cookies-файлы

Все cookie, отправляемые сайтами, хранятся на жестком диске. Если быть точнее — в папке «Пользователи» (Users). Например, куки из браузера Google Chrome хранятся по следующему пути:

По этому же пути вы найдете cookie из других браузеров. Название конкретного браузера ищите в папке Local.

Главные параметры cookie

Рассмотрим четыре главные параметра cookie-файла:

  • name. Название файла.
  • expires. Дата, когда истекает куки.
  • max-age. Максимальный срок жизни куки.
  • domain. Сайт, который может получить доступ к куки.

Отправка куки происходит каждый раз, когда пользователь пытается открыть страницу какого-либо сайта.

Какие виды cookies существуют в 2022 году

Все разнообразие куки можно разделить на пять видов:

  1. Third-party cookies. Это файлы, создаваемые так называемой третьей стороной. То есть эти куки формируются сторонним источником, например, сайтом агрегатора или сайтом рекламной системы. Куками этого типа пользуются сервисы, которые вы любите и хорошо знаете: Twitter, YouTube, «Google Карты» и многие другие.
  2. Временные. Как нетрудно догадаться, этот вид кук хранится на протяжении сессии пользователя. Именно поэтому их еще называют сессионными. Если пользователь закрывает браузер, временные куки будут мгновенно удалены.
  3. Супер-cookie. Это файл, который не похож на традиционные виды кук. Если обычный куки соотносится с конкретным сайтом (например, с доменным именем posylka.com), то суперкуки — только с доменной зоной (например .FR или .EU). Сами по себе суперкуки не представляют опасности, но они могут быть использованы хакерами для влияния на запрос к другому сайту: например, для перехвата данных или их компрометирования. Именно поэтому суперкуки блокируются всеми современными браузерами по умолчанию.

Читайте также:
Домен: что это такое, определение, примеры, «правильное» имя сайта

В чем разница между первичными куки и куки, полученными из третьих источников

Первичные куки генерируются у пользователя. Куки из третьих источников — где-то еще. Для рекламодателей и маркетологов важными являются куки из третьих источников. Пользователю они не нужны вообще (только если вы специально не хотите наблюдать парализованную рекламу)

Главное отличие первичных cookie от сторонних — вы не можете просматривать или использовать сведения о поведении посетителей на иных площадках, не связанных с вашим сайтом. А сторонние cookie как раз дают такую возможность.

Первичные cookie

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

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

Читайте также:
Что такое поведенческие факторы сайта в Яндексе и почему они важны

Сторонние cookie (из третьих источников)

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

Благодаря сторонним куки рекламодатели знают долгосрочные интересы пользователя, длительную историю посещений, все совершенные покупки. Сторонние cookie используются для настройки аудиторий ремаркетинга или аудиторий по типу look-a-like.

В браузере Google Chrome найти куки можно в разделе «Безопасность и конфиденциальность»:

Вы можете просмотреть все сохраненные браузером куки в настройках веб-обозревателя

Безопасны ли cookie. Несколько слов о приватности данных

Сегодня 98% сайтов вежливо оповещают нас о том, что они используют cookie. Почему еще пару лет назад этого не было?

Дело в том, что был принят специальный закон о защите данных (он же GDPR).В этом законе была прописана четкая формулировка: если сайт имеет доступ к кукам, он может скомпрометировать вашу приватность данных. Причина введения закона проста: до его принятия существовал свободный рынок кук, и компании могли без разрешения передавать пользовательские куки друг другу. GDPR решил эту проблему — по крайней мере, на бумаге. Сегодня, если вы хотите пользоваться сайтами и просматривать содержимое их страниц, принять куки придется.

Пример предупреждения об использовании и обработке cookie-файлов на публичном сайте

Вот основные особенности кук с точки зрения безопасности, которые могут быть важны для пользователя:

    Cookie отслеживают ваши действия на сайтах, чтобы потом автоматически подстроить контент на других сайтах (например, рекламу) под ваши привычки. Если вы не любите, когда вас «догоняют» объявления при однократном интересе, это может быть большой проблемой. Решить ее можно, воспользовавшись стандартными инструментами браузера (заблокировать куки), но большая часть сайтов после этого работать не будет.

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

Технический аудит сайта

  • Наличие дублей страниц, безопасность, корректность всех технических параметров: переадресаций, robots.txt, sitemap.xml скорость загрузки и др.
  • Техническая оптимизация — один из основных этапов в продвижении.

Как очистить cookie файлы

В браузере

Удалить файлы cookie можно в настройках используемого браузера. Например, для удаления всех кук в Google Chrome выполните следующие действия:

  1. Запустите Google Chrome.
  2. Нажмите значок «⋮» в правом верхнем углу экрана (меню инструментов).
  3. Выберите «Настройки». Открываем настройки Google Chrome
  4. Нажмите «Безопасность и конфиденциальность». В разделе «Безопасность и конфиденциальность» нажмите кнопку «Очистить историю»
  5. Кликните «Очистить историю».
  6. Отметьте чекбокс «Файлы cookie и другие данные сайтов». Ручная очистка cookie в браузере Google Chrome
  7. Выйдите из браузера, чтобы сохранить изменения.

Вы не можете чистить куки вручную на регулярной основе? Есть стороннее программное обеспечение, которое будет делать это за вас. Например, антивирус McAfee Multi Access. Это ПО также блокирует вредоносный код, найденный в системе, удаляет потенциально опасные программы, уничтожает вымогателей и шпионов. Если устанавливать тяжелый антивирус не хочется, попробуйте CCleaner.

С помощью CCleaner

Теперь посмотрим, как удалить куки в утилите CCleaner.

Устанавливаем программу. В разделе «Параметры» выбираем пункт «Cookie-файлы»:

CCleaner найдет все cookie-файлы на вашем компьютере

При помощи стрелок добавляем все ненужные куки в правый столбик:

Отмечаем все куки, которые нужно удалить

Теперь правым кликом по удаляемым кукам вызываем контекстное меню и выбираем пункт «Удалить»:

Кликните по ненужной куке правой кнопкой и удалите ее

Все! Куки успешно очищены.

Как включить/отключить cookies

Что касается прямого отключения куки, то его можно настроить в любом браузере. Для примера рассмотрим, как отключить куки в Google Chrome.

  1. Запустите Google Chrome.
  2. Нажмите значок «⋮» в правом верхнем углу экрана (меню инструментов).
  3. Выберите «Настройки».
  4. Нажмите «Безопасность и конфиденциальность».
  5. Кликните по разделу «Файлы cookie и другие данные сайтов»: Открываем раздел «Файлы cookie и другие данные сайтов»
  6. Выберите наиболее предпочтительный сценарий блокировки куки:
    • разрешить все файлы куки;
    • блокировать файлы куки от сторонних сайтов в режиме инкогнито;
    • блокировать все сторонние куки;
    • заблокировать вообще все куки.

    Мы заблокировали вообще все cookie от любых сайтов

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

Недостатки куки

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

    Снижение производительности системы. При работе с куки браузер шифрует / дешифрует эту последовательность каждый раз при посещении нового сайта. Такие действия снижают производительность приложения. Кроме того, если куки вообще не чистить, за несколько лет их количество будет настолько велико, что вы заметите это по меньшему пространству диска. Работа браузера также может быть замедлена, если у вас не медленный интернет и/или ПК.

Читайте также:
Как проверить скорость загрузки сайта и как ускорить загрузку

Кризис cookie. Каковы альтернативы?

В начале 2020-го года стало очевидно: будущее cookie как самостоятельной технологии находится под угрозой. Дело в том, что Google объявил план о постепенном отказе от third-party cookies к 2022 году.

Уже в ближайшие годы Google может кардинально изменить то, как именно браузеры обрабатывают пользовательскую информацию.

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

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

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

Глобальный рост стран, сайты которых чаще всего запрашивали куки в 2021 году

Итог. Зачем отказываться от cookie

Google начал эту политику, прикрываясь благими намерениями — свободным интернетом и защитой privacy каждого пользователя. Якобы пользователи сами выступали за больший уровень конфиденциальности.

Тем временем, браузеры Firefox и Safari уже продолжительное время не использует third-party cookies и не делают никакой шумихи из этого.

Глобальное «потребление» файлов cookie выросло на 31,6 % во время COVID-19

Если вы относитесь к маркетинговому рынку или рекламе, паниковать не стоит. Вот 4 главных тезиса о cookie, которые вам нужно знать:

Topics позволяет таргетироваться на пользователе при помощи списка интересов

  1. Глобальной трансформации не произойдет. Даже если Google полностью откажется от третьих cookie, большая часть наработанных технологий, инструментов и тактик сохранится
  2. Все типы cookie не запрещаются, запрещаются лишь cookie из третьих источников. Данные о посетителях по прежнему смогут собираться и обрабатываться при помощи cookie. Все данные, которые вы получаете от пользователей напрямую — законны, и никто от них не откажется.
  3. Если вы используете веб-аналитику для отслеживания пользователей на собственном сайте, отказ от третьих кук вам не страшен.
  4. Маркетологам приспособиться к миру без третьих кук может быть чуть сложнее. Изучайте альтернативные технологии таргетинга, например Topics. Это более открытая для пользователей технология, в рамках которой они могут увидеть темы (интересы), которые для них важны:

Комплексная веб-аналитика

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

Как включить поддержку файлов Cookie

Если Вы пользуетесь браузером Internet Explorer 6-11 , Вам нужно:

  • Зайти в меню «Сервис» (Tools) -> Свойства обозревателя» (Internet Options)
  • Выбрать закладку «Конфиденциальность» (Privacy)
  • Переместить бегунок в самое нижнее положение: «Разрешить все файлы куки» (Enable All Cookies).
  • Нажать «ОК»

Если Вы пользуетесь браузером Opera 9-12 , Вам нужно:

  • Зайти в меню, выбрать пункт «Настройки» («Инструменты») -> «Общие настройки» — «Расширенные»
  • В разделе «Cookies» установите флажок -> Принимать «cookies», остальные пункты оставить без отметок
  • Нажать «ОК»

Если Вы пользуетесь браузером Opera 15-20 , Вам нужно:

  • Зайти в меню, выбрать пункт «Настройки» -> «Конфиденциальность и безопасность»
  • В разделе «Cookies» установите флажок -> Разрешить локальное сохранение данных (рекомендовано)

Если Вы пользуетесь браузером Google Chrome , Вам нужно:

  • Зайти в меню «Настройки браузера» (значок в виде «гаечного ключа» в правом верхнем углу)
  • В меню «Параметры» — выберите вкладку «Расширенные» и в разделе «Конфиденциальность» выберите «Настройка содержания», затем в разделе «Файлы cookie» выберите значение «Разрешить сохранять локальные данные»
  • Нажмите кнопку «Закрыть»

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

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

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