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