Санитайзер

Санитайзер в 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) — изменяет теги и атрибуты, которые уже добавлены в список разрешенных.

Как использовать санитайзер

  1. Создайте объект санитайзера.

    $Sanitizer = new CBXSanitizer();
    
  2. Задайте правила фильтрации. Например, разрешите определенные теги и атрибуты с помощью функции AddTags.

    $Sanitizer->AddTags([
        'a' => ['href', 'id', 'style', 'alt'],
        'br' => [],
    ]);
    
  3. Примените санитайзер к HTML-коду.

    $pureHtml = $Sanitizer->SanitizeHtml($html);
    

Уровни фильтрации

Уровни фильтрации — это предустановленные наборы, содержащие разрешенные теги и атрибуты. Санитайзер поддерживает четыре уровня фильтрации:

  1. Высокий уровень 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'         => [],
    ];
    
  2. Средний уровень 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'       => [],
    ];
    
  3. Низкий уровень 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'],
    ];
    
  4. Пользовательский уровень 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>

Санитайзер удалит:

  1. тег <div>,

  2. тег <script> и его содержимое,

  3. атрибут onerror из тега <img>.

    <p>Это безопасный текст.</p>
    <img src="images/photo.jpg">

Рекомендации

  • Используйте санитайзер везде, где пользователи могут вводить HTML. Это защитит ваш сайт от вредоносного кода.

  • Начинайте с высокого уровня фильтрации. Он обеспечивает максимальную защиту. Если он удаляет нужные теги, перейдите на средний или низкий уровень.

  • Проверяйте результат очистки. Убедитесь, что нужные элементы остались на месте, например, ссылки или изображения.

Предыдущая
Следующая