Полный цикл в digital

Защищенные 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

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

  1. cookie была изменена или повреждена
  2. Есть проблемы с синхронизацией времени на серверах
  3. Используется неверный crypto_key

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

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!