1. Главная страница » Компьютеры » Document write document cookie

Document write document cookie

Автор: | 16.12.2019

Содержание

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

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

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

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

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

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

Чтение из document.cookie

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

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

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

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

Запись в document.cookie

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

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

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

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

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

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

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

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

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

  • path=/mypath

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

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

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

domain

  • domain=site.com

Домен, на котором доступны наши куки. На практике, однако, есть ограничения – мы не можем указать здесь какой угодно домен.

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

…Но что более интересно, мы не сможем получить эти куки на поддомене forum.site.com !

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

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

…Однако, если мы всё же хотим дать поддоменам типа forum.site.com доступ к куки, это можно сделать. Достаточно при установке куки на сайте site.com в качестве значения опции domain указать корневой домен: domain=site.com :

По историческим причинам установка 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 день.

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

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

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

secure

  • secure

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

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

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

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

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 не распознает пользователя и не произведёт платёж.

Читайте также:  Microsoft windows search filter host грузит процессор

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

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

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

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

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

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

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

Используются безопасные HTTP-методы (например, GET, но не POST).

Полный список безопасных HTTP-методов можно посмотреть в спецификации RFC7231. По сути, безопасными считаются методы, которые обычно используются для чтения, но не для записи данных. Они не должны выполнять никаких операций на изменение данных. Переход по ссылке является всегда GET-методом, то есть безопасным.

Операция осуществляет навигацию верхнего уровня (изменяет 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 :

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

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

setCookie(name, value, options)

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

deleteCookie(name)

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

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

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

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

Страница site.com загружает баннер с другого сайта: .

Вместе с баннером удалённый сервер ads.com может установить заголовок Set-Cookie с куки, например, >. Такие куки создаются с домена ads.com и будут видны только на сайте ads.com :

В следующий раз при доступе к ads.com удалённый сервер получит куки id и распознает пользователя:

Что ещё более важно, когда пользователь переходит с site.com на другой сайт other.com , на котором тоже есть баннер, то ads.com получит куки, так как они принадлежат ads.com , таким образом ads.com распознает пользователя и может отслеживать его перемещения между сайтами:

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

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

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

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

Если мы загружаем скрипт со стороннего домена, например

Комментарии

  • Если вам кажется, что в статье что-то не так — вместо комментария напишите на GitHub.
  • Для одной строки кода используйте тег , для нескольких строк кода — тег

, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)

  • Если что-то непонятно в статье — пишите, что именно и с какого места.
  • JavaScript дает возможность устанавливать и читать куки в браузере. В данном уроке мы рассмотрим как происходит работа с куками, а также сделаем простую страницу, которая будет помнить введеное имя и отображать его при каждом входе.

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

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

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

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

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

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

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

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

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

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

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

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

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

    Читайте также:  Fltv 28c10 доработка подсветки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Данный урок подготовлен для вас командой сайта ruseller.com
    Источник урока: www.elated.com
    Перевел: Сергей Фастунов
    Урок создан: 15 Июня 2010
    Просмотров: 204289
    Правила перепечатки

    5 последних уроков рубрики "Разное"

    Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов

    Проект готов, Все проверено на локальном сервере OpenServer и можно переносить сайт на хостинг. Вот только какую компанию выбрать? Предлагаю рассмотреть хостинг fornex.com. Отличное место для твоего проекта с перспективами бурного роста.

    Разработка веб-сайтов с помощью онлайн платформы Wrike

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

    20 ресурсов для прототипирования

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

    Топ 10 бесплатных хостингов

    Небольшая подборка провайдеров бесплатного хостинга с подробным описанием.

    Быстрая заметка: массовый UPDATE в MySQL

    Ни для кого не секрет как в MySQL реализовать массовый INSERT, а вот с UPDATE-ом могут возникнуть сложности. Чтобы не прибегать к манипуляциям события ON_DUPLICATE можно воспользоваться специальной конструкцией CASE … WHEN … THEN.

    Cookies are small strings of data that are stored directly in the browser. They are a part of HTTP protocol, defined by RFC 6265 specification.

    Cookies are usually set by a web-server using response Set-Cookie HTTP-header. Then the browser automatically adds them to (almost) every request to the same domain using Cookie HTTP-header.

    One of the most widespread use cases is authentication:

    1. Upon sign in, the server uses Set-Cookie HTTP-header in the response to set a cookie with a unique “session identifier”.
    2. Next time when the request is set to the same domain, the browser sends the cookie over the net using Cookie HTTP-header.
    3. So the server knows who made the request.

    We can also access cookies from the browser, using document.cookie property.

    There are many tricky things about cookies and their options. In this chapter we’ll cover them in detail.

    Reading from document.cookie

    Does your browser store any cookies from this site? Let’s see:

    The value of document.cookie consists of name=value pairs, delimited by ; . Each one is a separate cookie.

    To find a particular cookie, we can split document.cookie by ; , and then find the right name. We can use either a regular expression or array functions to do that.

    We leave it as an exercise for the reader. Also, at the end of the chapter you’ll find helper functions to manipulate cookies.

    Writing to document.cookie

    We can write to document.cookie . But it’s not a data property, it’s an accessor (getter/setter). An assignment to it is treated specially.

    A write operation to document.cookie updates only cookies mentioned in it, but doesn’t touch other cookies.

    For instance, this call sets a cookie with the name user and value John :

    If you run it, then probably you’ll see multiple cookies. That’s because document.cookie= operation does not overwrite all cookies. It only sets the mentioned cookie user .

    Technically, name and value can have any characters, to keep the valid formatting they should be escaped using a built-in encodeURIComponent function:

    There are few limitations:

    • The name=value pair, after encodeURIComponent , should not exceed 4kb. So we can’t store anything huge in a cookie.
    • The total number of cookies per domain is limited to around 20+, the exact limit depends on a browser.

    Cookies have several options, many of them are important and should be set.

    The options are listed after key=value , delimited by ; , like this:

    • path=/mypath

    The url path prefix, the cookie will be accessible for pages under that path. Must be absolute. By default, it’s the current path.

    If a cookie is set with path=/admin , it’s visible at pages /admin and /admin/something , but not at /home or /adminpage .

    Usually, we should set path to the root: path=/ to make the cookie accessible from all website pages.

    domain

    • domain=site.com

    A domain where the cookie is accessible. In practice though, there are limitations. We can’t set any domain.

    By default, a cookie is accessible only at the domain that set it. So, if the cookie was set by site.com , we won’t get it other.com .

    …But what’s more tricky, we also won’t get the cookie at a subdomain forum.site.com !

    There’s no way to let a cookie be accessible from another 2nd-level domain, so other.com will never receive a cookie set at site.com .

    It’s a safety restriction, to allow us to store sensitive data in cookies, that should be available only on one site.

    …But if we’d like to allow subdomains like forum.site.com get a cookie, that’s possible. When setting a cookie at site.com , we should explicitly set domain option to the root domain: domain=site.com :

    For historical reasons, domain=.site.com (a dot before site.com ) also works the same way, allowing access to the cookie from subdomains. That’s an old notation, should be used if we need to support very old browsers.

    Читайте также:  Motorola droid turbo xt1254 характеристики

    So, domain option allows to make a cookie accessible at subdomains.

    expires, max-age

    By default, if a cookie doesn’t have one of these options, it disappears when the browser is closed. Such cookies are called “session cookies”

    To let cookies survive browser close, we can set either expires or max-age option.

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

    Cookie expiration date, when the browser will delete it automatically.

    The date must be exactly in this format, in GMT timezone. We can use date.toUTCString to get it. For instance, we can set the cookie to expire in 1 day:

    If we set expires to a date in the past, the cookie is deleted.

    An alternative to expires , specifies the cookie expiration in seconds from the current moment.

    If zero or negative, then the cookie is deleted:

    secure

    • secure

    The cookie should be transferred only over HTTPS.

    By default, if we set a cookie at http://site.com , then it also appears at https://site.com and vice versa.

    That is, cookies are domain-based, they do not distinguish between the protocols.

    With this option, if a cookie is set by https://site.com , then it doesn’t appear when the same site is accessed by HTTP, as http://site.com . So if a cookie has sensitive content that should never be sent over unencrypted HTTP, then the flag is the right thing.

    samesite

    That’s another security attribute samesite . It’s designed to protect from so-called XSRF (cross-site request forgery) attacks.

    To understand how it works and when it’s useful, let’s take a look at XSRF attacks.

    XSRF attack

    Imagine, you are logged into the site bank.com . That is: you have an authentication cookie from that site. Your browser sends it to bank.com with every request, so that it recognizes you and performs all sensitive financial operations.

    Now, while browsing the web in another window, you accidentally come to another site evil.com . That site has JavaScript code that submits a form to bank.com with fields that initiate a transaction to the hacker’s account.

    The browser sends cookies every time you visit the site bank.com , even if the form was submitted from evil.com . So the bank recognizes you and actually performs the payment.

    That’s called a “Cross-Site Request Forgery” (in short, XSRF) attack.

    Real banks are protected from it of course. All forms generated by bank.com have a special field, so called “XSRF protection token”, that an evil page can’t generate or extract from a remote page (it can submit a form there, but can’t get the data back). And the site bank.com checks for such token in every form it receives.

    But such protection takes time to implement: we need to ensure that every form has the token field, and we must also check all requests.

    Enter cookie samesite option

    The cookie samesite option provides another way to protect from such attacks, that (in theory) should not require “xsrf protection tokens”.

    It has two possible values:

    • samesite=strict (same as samesite without value)

    A cookie with samesite=strict is never sent if the user comes from outside the same site.

    In other words, whether a user follows a link from their mail or submits a form from evil.com , or does any operation that originates from another domain, the cookie is not sent.

    If authentication cookies have samesite option, then XSRF attack has no chances to succeed, because a submission from evil.com comes without cookies. So bank.com will not recognize the user and will not proceed with the payment.

    The protection is quite reliable. Only operations that come from bank.com will send the samesite cookie, e.g. a form submission from another page at bank.com .

    Although, there’s a small inconvenience.

    When a user follows a legitimate link to bank.com , like from their own notes, they’ll be surprised that bank.com does not recognize them. Indeed, samesite=strict cookies are not sent in that case.

    We could work around that by using two cookies: one for “general recognition”, only for the purposes of saying: “Hello, John”, and the other one for data-changing operations with samesite=strict . Then a person coming from outside of the site will see a welcome, but payments must be initiated from the bank website, for the second cookie to be sent.

    A more relaxed approach that also protects from XSRF and doesn’t break user experience.

    Lax mode, just like strict , forbids the browser to send cookies when coming from outside the site, but adds an exception.

    A samesite=lax cookie is sent if both of these conditions are true:

    The HTTP method is “safe” (e.g. GET, but not POST).

    The full list of safe HTTP methods is in the RFC7231 specification. Basically, these are the methods that should be used for reading, but not writing the data. They must not perform any data-changing operations. Following a link is always GET, the safe method.

    The operation performs top-level navigation (changes URL in the browser address bar).

    That’s usually true, but if the navigation is performed in an , then it’s not top-level. Also, JavaScript methods for network requests do not perform any navigation, hence they don’t fit.

    So, what samesite=lax does is basically allows a most common “go to URL” operation to have cookies. E.g. opening a website link from notes satisfies these conditions.

    But anything more complicated, like a network request from another site or a form submittion loses cookies.

    If that’s fine for you, then adding samesite=lax will probably not break the user experience and add protection.

    Overall, samesite is a great option, but it has an important drawback:

    • samesite is ignored (not supported) by old browsers, year 2017 or so.

    So if we solely rely on samesite to provide protection, then old browsers will be vulnerable.

    But we surely can use samesite together with other protection measures, like xsrf tokens, to add an additional layer of defence and then, in the future, when old browsers die out, we’ll probably be able to drop xsrf tokens.

    httpOnly

    This option has nothing to do with JavaScript, but we have to mention it for completeness.

    The web-server uses Set-Cookie header to set a cookie. And it may set the httpOnly option.

    This option forbids any JavaScript access to the cookie. We can’t see such cookie or manipulate it using document.cookie .

    That’s used as a precaution measure, to protect from certain attacks when a hacker injects his own JavaScript code into a page and waits for a user to visit that page. That shouldn’t be possible at all, a hacker should not be able to inject their code into our site, but there may be bugs that let hackers do it.

    Normally, if such thing happens, and a user visits a web-page with hacker’s JavaScript code, then that code executes and gains access to document.cookie with user cookies containing authentication information. That’s bad.

    But if a cookie is httpOnly , then document.cookie doesn’t see it, so it is protected.

    Appendix: Cookie functions

    Here’s a small set of functions to work with cookies, more convenient than a manual modification of document.cookie .

    There exist many cookie libraries for that, so these are for demo purposes. Fully working though.

    getCookie(name)

    The shortest way to access cookie is to use a regular expression.

    The function getCookie(name) returns the cookie with the given name :

    Here new RegExp is generated dynamically, to match ; name= .

    Please note that a cookie value is encoded, so getCookie uses a built-in decodeURIComponent function to decode it.

    setCookie(name, value, options)

    Sets the cookie name to the given value with path=/ by default (can be modified to add other defaults):

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

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

    ×