Санитайзер в Битрикс
Санитайзер в Bitrix Framework защищает сайт от XSS-атак:
- Удаляет или экранирует опасные теги и атрибуты
- Автоматически закрывает незакрытые теги
- Корректирует структуру HTML
- Экранирует специальные символы
Методы класса CBXSanitizer
Для работы с санитайзером используются методы класса CBXSanitizer.
AddTags(array $tags)
добавляет теги и атрибуты в список разрешенныхDelAllTags(array $tagNames)
удаляет все теги из списка разрешенныхDeleteAttributes(array $arDeleteAttrs)
удаляет атрибуты из списка разрешенных HTML-теговDeleteSanitizedTags(bool $apply)
включает удаление тегов, не содержащихся в списке разрешенныхDelTags(array $tagNames)
удаляет теги из списка разрешенныхGetTags()
возвращает список разрешенных тегов и атрибутов в виде отформатированного текстаSanitizeHtml(string $html)
выполняет фильтрацию HTML-кода на основе заданных правилsetDelTagsWithContent(array $tags)
устанавливает список тегов, которые нужно удалять вместе с содержимымSetLevel(int $level)
автоматически заполняет список разрешенных тегов в соответствии с одним из предустановленных уровней фильтрацииUpdateTags(array $tags)
изменяет теги и атрибуты, которые уже добавлены в список разрешенных
Как использовать санитайзер
$Sanitizer = new CBXSanitizer();
Например, разрешите определенные теги и атрибуты с помощью функции AddTags
:
$Sanitizer->AddTags([
'a' => ['href', 'id', 'style', 'alt'],
'br' => [],
]);
$pureHtml = $Sanitizer->SanitizeHtml($html);
Уровни фильтрации
Уровни фильтрации — это предустановленные наборы, содержащие разрешенные теги и атрибуты. Санитайзер поддерживает четыре уровня фильтрации:
SECURE_LEVEL_HIGH
Разрешает только базовые текстовые теги без атрибутов. Подходит для строгой защиты:
$arTags = [
'b' => [],
'br' => [],
'big' => [],
'blockquote' => [],
'code' => [],
'del' => [],
'dt' => [],
'dd' => [],
'font' => [],
'h1' => [],
'h2' => [],
'h3' => [],
'h4' => [],
'h5' => [],
'h6' => [],
'hr' => [],
'i' => [],
'ins' => [],
'li' => [],
'ol' => [],
'p' => [],
'small' => [],
's' => [],
'sub' => [],
'sup' => [],
'strong' => [],
'pre' => [],
'u' => [],
'ul' => [],
];
SECURE_LEVEL_MIDDLE
Разрешает больше тегов, например, изображения и ссылки. Подходит для большинства случаев:
$arTags = [
'a' => ['href', 'title', 'name', 'alt'],
'b' => [],
'br' => [],
'big' => [],
'code' => [],
'caption' => [],
'del' => ['title'],
'dt' => [],
'dd' => [],
'font' => ['color', 'size'],
'color' => [],
'h1' => [],
'h2' => [],
'h3' => [],
'h4' => [],
'h5' => [],
'h6' => [],
'hr' => [],
'i' => [],
'img' => ['src', 'alt', 'height', 'width', 'title'],
'ins' => ['title'],
'li' => [],
'ol' => [],
'p' => [],
'pre' => [],
's' => [],
'small' => [],
'strong' => [],
'sub' => [],
'sup' => [],
'table' => ['border', 'width'],
'tbody' => ['align', 'valign'],
'td' => ['width', 'height', 'align', 'valign'],
'tfoot' => ['align', 'valign'],
'th' => ['width', 'height'],
'thead' => ['align', 'valign'],
'tr' => ['align', 'valign'],
'u' => [],
'ul' => [],
];
SECURE_LEVEL_LOW
Разрешает практически все теги и требует осторожности. Не включает потенциально опасные теги script
, iframe
и embed
:
$arTags = [
'a' => ['href', 'title', 'name', 'style', 'id', 'class', 'shape', 'coords', 'alt', 'target'],
'b' => ['style', 'id', 'class'],
'br' => ['style', 'id', 'class'],
'big' => ['style', 'id', 'class'],
'blockquote' => ['title', 'style', 'id', 'class'],
'caption' => ['style', 'id', 'class'],
'code' => ['style', 'id', 'class'],
'del' => ['title', 'style', 'id', 'class'],
'div' => ['title', 'style', 'id', 'class', 'align'],
'dt' => ['style', 'id', 'class'],
'dd' => ['style', 'id', 'class'],
'font' => ['color', 'size', 'face', 'style', 'id', 'class'],
'h1' => ['style', 'id', 'class', 'align'],
'h2' => ['style', 'id', 'class', 'align'],
'h3' => ['style', 'id', 'class', 'align'],
'h4' => ['style', 'id', 'class', 'align'],
'h5' => ['style', 'id', 'class', 'align'],
'h6' => ['style', 'id', 'class', 'align'],
'hr' => ['style', 'id', 'class'],
'i' => ['style', 'id', 'class'],
'img' => ['src', 'alt', 'height', 'width', 'title'],
'ins' => ['title', 'style', 'id', 'class'],
'li' => ['style', 'id', 'class'],
'map' => ['shape', 'coords', 'href', 'alt', 'title', 'style', 'id', 'class', 'name'],
'ol' => ['style', 'id', 'class'],
'p' => ['style', 'id', 'class', 'align'],
'pre' => ['style', 'id', 'class'],
's' => ['style', 'id', 'class'],
'small' => ['style', 'id', 'class'],
'strong' => ['style', 'id', 'class'],
'span' => ['title', 'style', 'id', 'class', 'align'],
'sub' => ['style', 'id', 'class'],
'sup' => ['style', 'id', 'class'],
'table' => ['border', 'width', 'style', 'id', 'class', 'cellspacing', 'cellpadding'],
'tbody' => ['align', 'valign', 'style', 'id', 'class'],
'td' => ['width', 'height', 'style', 'id', 'class', 'align', 'valign', 'colspan', 'rowspan'],
'tfoot' => ['align', 'valign', 'style', 'id', 'class', 'align', 'valign'],
'th' => ['width', 'height', 'style', 'id', 'class', 'colspan', 'rowspan'],
'thead' => ['align', 'valign', 'style', 'id', 'class'],
'tr' => ['align', 'valign', 'style', 'id', 'class'],
'u' => ['style', 'id', 'class'],
'ul' => ['style', 'id', 'class'],
];
SECURE_LEVEL_CUSTOM
Ограничения задаются вручную методом AddTags()
. По умолчанию соответствует высокому уровню фильтрации.
Как применить уровень фильтрации
Чтобы применить один из уровней, используйте метод setLevel
:
// создаем объект санитайзера
$Sanitizer = new CBXSanitizer;
// устанавливаем средний уровень фильтрации
$Sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_MIDDLE);
// очищаем HTML-код с помощью санитайзера
$pureHtml = $Sanitizer->SanitizeHtml($html);
Пример работы санитайзера
Санитайзеру с уровнем фильтрации SECURE_LEVEL_MIDDLE
поступает HTML-код:
<div>
<p>Это безопасный текст.</p>
<script>alert('XSS');</script>
<img src="images/photo.jpg" onerror="alert('XSS')">
</div>
Санитайзер удалит:
- Тег
div
- Тег
script
и его содержимое - Атрибут
onerror
из тегаimg
<p>Это безопасный текст.</p>
<img src="images/photo.jpg">
- Используйте санитайзер везде, где пользователи могут вводить HTML. Это защитит ваш сайт от вредоносного кода
- Начинайте с высокого уровня фильтрации. Он обеспечивает максимальную защиту. Если он удаляет нужные теги, перейдите на средний или низкий уровень
- Проверяйте результат очистки. Убедитесь, что нужные элементы остались на месте, например, ссылки или изображения