Полный цикл в digital

XSS (Cross-Site Scripting) уязвимость в Битрикс

XSS (Cross-Site Scripting) — уязвимость, которая позволяет выполнить вредоносный JavaScript-код на странице сайта. Если система не проверяет входные данные, код может получить доступ к пользовательским данным или изменить содержимое страницы.

Любые данные, полученные от пользователей через формы или другие источники, могут содержать опасный код. Чтобы предотвратить XSS, необходимо экранировать все внешние данные перед выводом в HTML или JavaScript.

Экранирование HTML

Чтобы заменить спецсимволы на HTML-сущности используйте:

  • htmlspecialcharsbx функция преобразует спецсимволы <, >, », ', & в HTML-сущности
  • \Bitrix\Main\Text\HtmlFilter::encode() работает аналогично, но поддерживает Unicode

Избегайте htmlspecialcharsEx() функция работает по черному списку, то есть запрещает только определенные символы. Лучше использовать полное экранирование htmlspecialcharsbx или белый список CBXSanitizer.

<!- Правильно: спецсимволы экранированы, скрипты не выполнятся ->
<div><?= \Bitrix\Main\Text\HtmlFilter::encode($foo) ?></div>
<textarea><?= \Bitrix\Main\Text\HtmlFilter::encode($foo) ?></textarea>

<!- Неправильно: если $foo содержит <sc ript>, он выполнится ->
<div><?= $foo ?></div>
<textarea><?= $foo ?></textarea>

Экранирование можно пропускать только для доверенных данных, например, для строк из исходного кода.

Экранирование JavaScript

Метод CUtil::JSEscape() экранирует спецсимволы JavaScript ', ", \, \n, \r. Подходит для строк, заключенных в кавычки.
// Правильно: строка в кавычках, спецсимволы экранированы
<script>
  var foo = '<?= CUtil::JSEscape($foo) ?>';
</script>

// Неправильно: без кавычек код выполнится как есть
<script>
  var foo = <?= CUtil::JSEscape($foo) ?>;
</script>

Двойное экранирование

Используйте совместно экранирование HTML и JavaScript:

  • В обработчиках событий onclick, onload и так далее
  • В атрибутах, содержащих JavaScript, href="javascript:..."
  • В шаблонах динамических скриптов
<?php
// Сначала экранируем для JS, затем для HTML
$someData = CUtil::JSEscape($foo);
$someData = htmlspecialcharsbx($someData);
?>
<a href="#" onclick="doSome('<?= $someData ?>');">Click</a>

Работа с атрибутами

Заключайте значения атрибутов в двойные кавычки ". С одинарными кавычками экранирование не сработает.

<!- Правильно: значения в двойных кавычках ->
<input type="text" name="foo" value="<?= htmlspecialcharsbx($fooValue) ?>" />

<!- Неправильно: в одинарных кавычках экранирование может не сработать ->
<input type="text" name="foo" value='<?= htmlspecialcharsbx($fooValue) ?>' />

Работа с JSON

Неэкранированный JSON может содержать закрывающие теги </script>, уязвимости XSS и вредоносный JavaScript.

Метод Json::encode:

  • Преобразует данные в JSON
  • Экранирует спецсимволы
  • Добавляет Unicode-экранирование
<?php
// Массив с пользовательскими данными
$foo = ['key' => $userInput];
?>
<script>
    // Безопасный вывод: </script> и другие спецсимволы экранированы
    var foo = <?= Bitrix\Main\Web\Json::encode($foo) ?>;
</script>

Очищение HTML тегов

Если необходимо вывести HTML-код пользователя, используйте санитайзер CBXSanitizer. Он удалит опасные теги и оставит только разрешенные.

Метод sanitizeHtml() преобразует полученный HTML-текст:

<div><?= (new CBXSanitizer)->sanitizeHtml($foo) ?></div>
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!