HTML-инъекции — это вид атак на веб-приложения, при котором злоумышленник внедряет вредоносный HTML-код в веб-страницу, чтобы изменить её поведение или внешний вид. В отличие от XSS (межсайтового скриптинга), HTML-инъекции обычно направлены на внесение изменений в структуру страницы, а не на выполнение вредоносных скриптов.
Примеры атак с использованием HTML-инъекций
HTML-инъекции могут возникать, когда данные от пользователя отображаются на веб-странице без соответствующей обработки и очистки. Рассмотрим несколько примеров:
Пример 1: Внедрение простого HTML-кода
Предположим, есть форма обратной связи, которая принимает комментарии от пользователей и выводит их на странице:
Если веб-приложение выводит комментарий без фильтрации, злоумышленник может ввести следующий код в поле комментария:
<h1>Взломано</h1>
Этот код будет сохранён на сервере и после этого отображён на странице:
Как результат, веб-страница будет отображать заголовок "Взломано" вместо обычного текста комментария.
Пример 2: Изменение структуры страницы
Более сложный пример — злоумышленник может попытаться изменить структуру страницы, добавив собственный HTML-код:
Если сервер не проводит валидацию входных данных и просто вставляет их в HTML, это может привести к тому, что имя пользователя будет отображаться жирным шрифтом, и таким образом злоумышленник может манипулировать внешним видом или содержанием страницы.
Пример 3: Внедрение гиперссылок
Злоумышленник может внедрить тег <a> (ссылку), чтобы перенаправить пользователей на вредоносный сайт:
Если это внедрение не будет обработано должным образом, пользователи могут быть обмануты и кликнуть на вредоносную ссылку.
Как защититься от HTML-инъекций?
Защита от HTML-инъекций сводится к правильной обработке данных, вводимых пользователями. Вот несколько методов, которые помогут предотвратить такие атаки:
1. Валидация входных данных
Валидация данных на этапе ввода — первый шаг к защите. Валидация проверяет, что пользовательские данные соответствуют ожиданиям. Например, если поле принимает только текст, то надо убедиться, что в него нельзя ввести HTML или JavaScript.
Этот пример проверяет, что входные данные содержат только буквы, цифры и пробелы.
2. Экранирование данных (escaping)
Экранирование данных перед их выводом — один из самых надёжных способов предотвратить внедрение HTML-кода. Это процесс замены специальных символов HTML (таких как <, >, ", &) на их HTML-эквиваленты.
Например, если пользователь вводит:
<h1>Заголовок</h1>
то перед выводом на страницу этот ввод должен быть преобразован в:
<h1>Заголовок</h1>
В результате браузер отобразит текст "<h1>Заголовок</h1>", а не заголовок.
Пример на PHP:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
Пример на JavaScript:
function escapeHTML(str) {
return str.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
3. Использование шаблонных движков
Многие современные веб-фреймворки и движки шаблонов по умолчанию экранируют пользовательские данные. Например:
- Django (Python): автоматически экранирует все данные, передаваемые в шаблон, если не указано иное.
- Twig (PHP): также по умолчанию экранирует вывод.
- Handlebars (JavaScript): экранирует данные при рендеринге.
Использование таких движков значительно снижает риск HTML-инъекций, так как они автоматизируют процесс экранирования.
4. Ограничение допустимых тегов (whitelisting)
Иногда вам может понадобиться разрешить часть HTML-кода (например, для систем комментариев с поддержкой форматирования). В этом случае лучше использовать подход, основанный на белом списке разрешённых тегов и атрибутов.
Пример на PHP с использованием библиотеки HTML Purifier:
require_once 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($user_input);
Эта библиотека очистит ввод от любых неразрешённых тегов и атрибутов.
5. Политики контентной безопасности (Content Security Policy, CSP)
CSP — механизм, который помогает предотвратить выполнение неавторизованных сценариев на веб-странице. Хотя CSP в первую очередь направлен на борьбу с XSS, он также может помочь уменьшить воздействие HTML-инъекций.
Пример настройки CSP в заголовках HTTP:
Content-Security-Policy: default-src 'self'; script-src 'none'; object-src 'none';
Эта политика запрещает выполнение любых скриптов и объектов, если они не загружены непосредственно с того же домена, что и страница.
6. Использование готовых библиотек для очистки данных
Существуют готовые библиотеки и инструменты для очистки входных данных, которые помогут избежать HTML-инъекций. Примеры:
- DOMPurify (JavaScript): библиотека для очистки пользовательского ввода.
- HTMLPurifier (PHP): библиотека для очистки HTML-контента.
Эти библиотеки позволяют легко и безопасно фильтровать ввод и предотвращать внедрение вредоносного HTML.
Заключение
HTML-инъекции — это важная угроза для безопасности веб-приложений, особенно если они обрабатывают большое количество пользовательских данных. Разработчикам необходимо уделять внимание вопросам валидации, экранирования и очистки входных данных, чтобы предотвратить подобные атаки.
Основные способы защиты от HTML-инъекций включают:
- Валидацию данных на стороне сервера и клиента.
- Экранирование пользовательского ввода перед выводом.
- Ограничение допустимых тегов и атрибутов через белые списки.
- Использование политик контентной безопасности (CSP).
- Применение готовых библиотек для фильтрации и очистки данных.
Соблюдая эти меры, вы значительно снизите вероятность успешных HTML-инъекций в вашем веб-приложении.
Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?
Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика
Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.
Обязательно прочитайте: Что должен знать и уметь тестировщик
Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам