Защищенные 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, ядро автоматически разбивает их на несколько частей:
- Первая
cookiesomeNameсодержит ссылку на другие части данных - Остальные
cookiesomeName_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 на всех серверах вашего проекта.