Блог Горошко Андрея 1C-Битрикс  Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters)

 Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters)

Средний рейтинг
Еще нет оценок

Когда вы делаете компонент асинхронным (AJAX), его параметры ($arParams) становятся уязвимы. Злоумышленник может изменить их прямо в JavaScript-коде перед отправкой запроса.

Например, подменить IBLOCK_ID и получить доступ к данным из другого инфоблока.

Чтобы этого избежать, в Битрикс существует механизм подписанных параметров.

Как это работает?

  1. При первоначальной (не-AJAX) загрузке компонента, его параметры ($arParams) сериализуются, к ним добавляется «соль» (уникальный ключ) и все это подписывается с помощью хэша (hmac_sha256).
  2. Эта зашифрованная строка передается в шаблон и затем используется в JavaScript при AJAX-запросе.
  3. На сервере, при получении AJAX-запроса, компонент проверяет подпись. Если параметры были изменены, подпись не сойдется, и Битрикс прервет выполнение действия.

Шаг 1: Получение подписанных параметров в шаблоне

В компонентах, использующих class.php, это делается очень просто.

В class.php:
Ничего делать не нужно! CBitrixComponent делает это автоматически.

В template.php:
Нужно получить подписанную строку и передать ее в JavaScript.

// /path/to/component/templates/.default/template.php

<div id="my-component">...</div>

<script>
    // Передаем подписанные параметры в JS
    var myComponentSignedParams = '<?= $this->getComponent()->getSignedParameters() ?>';
</script>

Метод $this->getComponent()->getSignedParameters() возвращает готовую зашифрованную строку.

Шаг 2: Использование подписанных параметров в script.js

Теперь эту строку нужно добавить в AJAX-запрос runComponentAction.

// /path/to/component/templates/.default/script.js

BX.ready(function() {
    BX.bind(BX('some-button'), 'click', function() {
        BX.ajax.runComponentAction(
            'my:ajax.list',
            'reload',
            {
                mode: 'class',
                // Передаем нашу подписанную строку
                signedParameters: myComponentSignedParams 
            }
        ).then(function(response) {
            // success
        });
    });
});

Шаг 3: Автоматическая проверка на сервере в class.php

Чтобы проверка подписи происходила автоматически, нужно добавить специальный фильтр в configureActions.

// /local/components/my/ajax.list/class.php
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Engine\ActionFilter;

class MyAjaxListComponent extends CBitrixComponent implements Controllerable
{
    public function configureActions()
    {
        return [
            'reload' => [
                'prefilters' => [
                    // Этот фильтр автоматически расшифрует signedParameters,
                    // проверит подпись и подменит $this->arParams на безопасные.
                    new ActionFilter\Authentication(),
                ]
            ]
        ];
    }

    public function reloadAction()
    {
        // Внутри этого метода $this->arParams уже будут безопасными
        // и проверенными. Если подпись была неверной,
        // выполнение просто не дойдет до этого места.
        
        // ...
    }
    
    // ... остальной код класса
}

Что делает фильтр SignedParameters?

  1. Ищет в POST-запросе ключ signedParameters.
  2. Расшифровывает его с помощью секретного ключа.
  3. Проверяет хэш-подпись.
  4. Если все в порядке, он полностью заменяет текущий объект $this->arParams на те параметры, которые были в подписи.
  5. Если проверка провалена, он прерывает выполнение с ошибкой безопасности.

Вывод:
Использование подписанных параметров — это обязательное правило при создании AJAX-компонентов. Этот механизм надежно защищает вас от подмены параметров на клиенте и гарантирует, что ваш бэкенд-код получит именно те настройки, с которыми компонент был изначально вызван на странице. Интеграция через getSignedParameters() и фильтр SignedParameters делает этот процесс почти полностью автоматическим.

SignedParameters, Битрикс безопасность, AJAX компонент, подпись параметров, CComponent::getSignedParameters, checkComponentParameters.

Мой рейтинг:

Добавить комментарий

Related Post

Создание кастомной страницы в админке Битрикс: Полное руководствоСоздание кастомной страницы в админке Битрикс: Полное руководство

Средний рейтинг Еще нет оценок Иногда стандартного функционала админки не хватает. Требуется создать страницу для кастомного отчета, дашборда или инструмента управления. Битрикс позволяет легко интегрировать свои страницы в административный интерфейс,

Валидация данных в D7 ORM: Встроенные и кастомные валидаторыВалидация данных в D7 ORM: Встроенные и кастомные валидаторы

Средний рейтинг Еще нет оценок Валидация — это процесс проверки данных на корректность перед их сохранением. D7 ORM предоставляет мощный механизм валидаторов, который описывается прямо в getMap() вашей сущности. Это позволяет держать

ExpressionField в D7 ORM: SQL-функции и вычисления прямо в запросахExpressionField в D7 ORM: SQL-функции и вычисления прямо в запросах

Средний рейтинг Еще нет оценок ExpressionField — это мощный инструмент D7 ORM, который позволяет создавать «виртуальные» поля, значение которых вычисляется с помощью произвольного SQL-выражения. Это позволяет перенести часть логики с PHP