Защищенные cookie в Битрикс
Защищенные cookie
шифруют данные и делают их недоступными для чтения или изменения без ключа. В отличие от обычных cookie
, которые хранят данные в открытом виде, защищенные cookie
предотвращают перехват или изменение данных злоумышленниками.
Ключ crypto_key
Для работы защищенных cookie
нужен ключ crypto_key
. Он используется для шифрования данных. Ключ должен быть уникальным и криптостойким. Рекомендуем создавать ключ длиной 32
символа, состоящий из букв латинского алфавита и цифр.
Ключ хранится в файле /bitrix/.settings.php
. В новых дистрибутивах ключ генерируется автоматически. Если ключа нет, добавьте его вручную. В разделе crypto
передайте ключ crypto_key
в массив value
:
/bitrix/.settings.php<?php
return [
//...
'crypto' => [
'value' => [
'crypto_key' => 'mysupersecretphrase',
],
// 'readonly' указывает, что значение 'crypto_key' нельзя изменить через интерфейс администратора. Это повышает безопасность: ключ остается постоянным и защищенным от случайных изменений
'readonly' => true,
]
//...
];
Как создать защищенную cookie
Чтобы создать защищенную cookie
, используйте класс \Bitrix\Main\Web\CryptoCookie
. Создайте объект $cookie
и добавьте его в HTTP-ответ, чтобы браузер сохранил cookie
:
$cookie = new \Bitrix\Main\Web\CryptoCookie('someName', 'secret value');
\Bitrix\Main\Context::getCurrent()->getResponse()->addCookie($cookie);
В примере используются следующие методы:
CryptoCookie()
создает зашифрованную cookie с параметрамиsomeName
имя cookie, которое будет использоваться для доступа к ее значениюsecret value
значение, которое нужно сохранить в cookie и зашифровать перед отправкойgetCurrent()
возвращает объект с данными о текущем запросе и ответеgetResponse()
возвращает объект HTTP-ответаaddCookie()
добавляет созданную cookie в список всех cookie, которые будут отправлены браузеру
Почему создаются несколько cookie
Значение cookie
ограничено по длине. Зашифрованные данные кодируются в формат base64
. Если объем данных превышает допустимый размер cookie
, ядро автоматически разбивает их на несколько частей:
- Первая
cookie
someName
содержит ссылку на другие части данных - Остальные
cookie
someName_0, someName_1 хранят зашифрованные фрагменты
Как прочитать защищенную cookie
Чтобы получить расшифрованное значение cookie
, используйте стандартный метод getCookie()
. Метод автоматически определяет зашифрованную cookie и расшифровывает ее значение:
$httpRequest = \Bitrix\Main\Context::getCurrent()->getRequest();
//secret value
echo $httpRequest->getCookie('someName');
В примере используются следующие методы:
getCurrent()
возвращает объект с данными о текущем запросе и ответеgetRequest()
извлекает объект HTTP-запроса с данными от браузераgetCookie('someName')
- Ищет cookie с именем
someName
- Проверяет, является ли cookie зашифрованной
- Расшифровывает значение, если оно было зашифровано
- Ищет cookie с именем
Причины ошибки при расшифровке cookie
Расшифровка может завершиться ошибкой, если:
cookie
была изменена или повреждена- Есть проблемы с синхронизацией времени на серверах
- Используется неверный
crypto_key
Чтобы избежать проблем, используйте один и тот же crypto_key на всех серверах вашего проекта.