Когда вы делаете компонент асинхронным (AJAX), его параметры ($arParams) становятся уязвимы. Злоумышленник может изменить их прямо в JavaScript-коде перед отправкой запроса.
Например, подменить IBLOCK_ID и получить доступ к данным из другого инфоблока.
Чтобы этого избежать, в Битрикс существует механизм подписанных параметров.
Как это работает?
- При первоначальной (не-AJAX) загрузке компонента, его параметры ($arParams) сериализуются, к ним добавляется «соль» (уникальный ключ) и все это подписывается с помощью хэша (hmac_sha256).
- Эта зашифрованная строка передается в шаблон и затем используется в JavaScript при AJAX-запросе.
- На сервере, при получении 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?
- Ищет в POST-запросе ключ signedParameters.
- Расшифровывает его с помощью секретного ключа.
- Проверяет хэш-подпись.
- Если все в порядке, он полностью заменяет текущий объект $this->arParams на те параметры, которые были в подписи.
- Если проверка провалена, он прерывает выполнение с ошибкой безопасности.
Вывод:
Использование подписанных параметров — это обязательное правило при создании AJAX-компонентов. Этот механизм надежно защищает вас от подмены параметров на клиенте и гарантирует, что ваш бэкенд-код получит именно те настройки, с которыми компонент был изначально вызван на странице. Интеграция через getSignedParameters() и фильтр SignedParameters делает этот процесс почти полностью автоматическим.
SignedParameters, Битрикс безопасность, AJAX компонент, подпись параметров, CComponent::getSignedParameters, checkComponentParameters.