Программная фильтрация данных через Security Filter Request
Проблема
При интеграции с внешними системами данные поступают не через стандартные суперглобальные переменные, а через API, webhooks или файлы. Встроенный WAF Битрикса автоматически фильтрует только $_GET, $_POST и $_COOKIE, оставляя кастомные источники без защиты от XSS и SQL-инъекций.
Решение
Класс Bitrix\Security\Filter\Request позволяет программно применять те же фильтры безопасности к любым данным. Вы можете подключить нужные аудиторы и выбрать стратегию обработки опасных значений.
use Bitrix\Main\Loader;
use Bitrix\Main\Diag\EventLogger;
use Bitrix\Security\Filter\Request;
use Bitrix\Security\Filter\Auditor;
use Psr\Log\LogLevel;
Loader::includeModule('security');
// Данные из внешнего источника (API, webhook, файл)
$externalData = [
'name' => 'Иван Петров',
'comment' => '<script>alert("xss")</script>Текст комментария',
'query' => "'; DROP TABLE users; --",
];
// Создаём фильтр с нужным действием
$filter = new Request([
'action' => 'filter', // filter|clear|none
'log' => 'Y', // логировать срабатывания в EventLog
]);
// Подключаем аудиторы для проверки
$filter->setAuditors([
'XSS' => new Auditor\Xss(),
'SQL' => new Auditor\Sql(),
]);
// Фильтруем данные (ключ 'data' для произвольных массивов)
$result = $filter->filter(['data' => $externalData]);
// Получаем очищенные данные
$cleanData = $result['data'] ?? $externalData;
Параметр action определяет поведение при обнаружении угрозы:
filter— удаляет опасные конструкции, сохраняя остальной текстclear— полностью очищает значение при срабатыванииnone— только логирует, не изменяя данные
Для анализа того, что было отфильтровано, используйте методы класса:
// Проверяем, сработал ли какой-либо аудитор
if ($filter->isAuditorsTriggered()) {
// Добавляем свой формат записи в лог
$logger = new EventLogger('mymodule', 'EXTERNAL_DATA_FILTERED');
// Получаем список изменённых переменных
foreach ($filter->getChangedVars() as $varName => $originalValue) {
$logger->log(
LogLevel::WARNING,
'Отфильтровано опасное значение в {variable}',
[
'variable' => $varName,
'original' => $originalValue,
]
);
}
}
Доступные аудиторы находятся в пространстве Bitrix\Security\Filter\Auditor:
Xss— обнаружение XSS-атак (скрипты, события, опасные теги)Sql— обнаружение SQL-инъекций (UNION, SELECT, DROP)Path— обнаружение path traversal (../, доступ к файлам)
Итог
Класс Request из модуля security позволяет защитить любые входные данные теми же механизмами, что использует встроенный WAF Битрикса. Используйте его при обработке данных из API, webhooks, импортируемых файлов и других внешних источников.