Защищенные 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, используйте класс \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 ограничено по длине. Зашифрованные данные кодируются в формат base64. Если объем данных превышает допустимый размер cookie, ядро автоматически разбивает их на несколько частей:

  • первая cookie someName содержит ссылку на другие части данных,

  • остальные cookie (someName_0, someName_1, someName_N) хранят зашифрованные фрагменты.

Чтобы получить расшифрованное значение cookie, используйте стандартный метод getCookie(). Метод автоматически определяет зашифрованную cookie и расшифровывает ее значение.

$httpRequest = \Bitrix\Main\Context::getCurrent()->getRequest();
        echo $httpRequest->getCookie('someName'); //secret value
        

В примере используются следующие методы:

  • getCurrent() возвращает объект с данными о текущем запросе и ответе,

  • getRequest() извлекает объект HTTP-запроса с данными от браузера,

  • getCookie('someName'):

    • ищет cookie с именем 'someName',

    • проверяет, является ли cookie зашифрованной,

    • расшифровывает значение, если оно было зашифровано.

Расшифровка может завершиться ошибкой, если:

  • cookie была изменена или повреждена,

  • есть проблемы с синхронизацией времени на серверах,

  • используется неверный crypto_key.

Чтобы избежать проблем, используйте один и тот же crypto_key на всех серверах вашего проекта.

Предыдущая
Следующая