HTML-валидатор и проверка XSS: как найти ошибки разметки и опасные конструкции

Разметка выглядит нормально, но браузер отображает её не так, как ожидалось. Или страница принимает пользовательский HTML, и нужно убедиться, что через него нельзя выполнить скрипт. Или вы проверяете чужой код перед вставкой. HTML-валидатор и проверка XSS находит незакрытые и лишние теги, неправильную вложенность, повторяющиеся id и атрибуты, ошибки в сущностях и кавычках, а отдельно отмечает конструкции, через которые выполняется JavaScript. Код не выполняется и не отображается — проверка безопасна для любой разметки.

В этой статье разберём, какие ошибки находит валидатор, что такое XSS и почему javascript: опасен, чем проверка отличается от W3C и почему вставлять чужой код сюда безопасно.

Интерфейс онлайн-инструмента HTML-валидатор и проверка XSS
Интерфейс онлайн-инструмента HTML-валидатор и проверка XSS

Что умеет валидатор

HTML-валидатор и проверка XSS принимает HTML-код страницы или фрагмента и проверяет его по двум направлениям.

Параметр Что делает
HTML-код Страница целиком или фрагмент, до 500 000 символов
Показать только замечания безопасности (XSS) Отфильтровывает ошибки разметки, оставляет только опасные конструкции
Проверить Запускает проверку

Код не выполняется и не отображается: он разбирается как текст, а результаты выводятся только как текст. Всё выполняется в браузере: введённые данные никуда не отправляются.

Ошибки разметки, которые находит валидатор

Инструмент проверяет самые частые проблемы HTML.

Ошибка Пример Почему это проблема
Незакрытый тег без Браузер закроет сам, но структура может быть неверной
Лишний закрывающий тег `` без открывающего Ломает структуру документа
Неправильная вложенность внутри Браузер исправит, но результат может отличаться от ожидаемого
Повторяющийся id Два id="item" id должен быть уникальным на странице
Повторяющийся атрибут Два class на одном теге Браузер возьмёт один, второй потеряется
Ошибка в сущности &nbsp без ; Сущность не распознается
Ошибка в кавычках Незакрытая кавычка в атрибуте Атрибут разорвётся

У каждого замечания указана строка — удобно исправлять.

Что такое XSS и почему это важно

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

XSS возникает, когда пользовательские данные вставляются в HTML без экранирования. Валидатор помогает найти конструкции, через которые JavaScript может выполниться.

Опасные конструкции, которые отмечает валидатор

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

Конструкция Пример Чем опасна
Скрипт … Прямое выполнение кода
Обработчик события onclick="…", onload="…" Выполняет код при событии
Адрес javascript: `` Выполняет код при клике
Адрес data: `` Может содержать HTML со скриптом
srcdoc `` Встраивает HTML со скриптом
| Меняет базу для всех ссылок
| Перенаправляет на другой адрес

Отдельно валидатор отмечает замаскированные конструкции — через сущности и пробелы. Например, javascript: выглядит безобидно в исходном тексте, но браузер декодирует сущность и выполнит javascript:.

Почему javascript: опасен

Это классический обход фильтров.

  1. Браузер получает адрес javascript:alert(1).
  2. Сначала декодирует сущности: a — это a.
  3. Получается javascript:alert(1).
  4. Браузер выполняет код.

Фильтр, который ищет слово javascript в исходном тексте, такую конструкцию пропустит. Валидатор декодирует значения так же, как браузер, и поэтому находит замаскированные варианты.

Зачем проверять только XSS

Иногда ошибки разметки не важны, а безопасность — критична.

Ситуация Зачем фильтр XSS
Проверка пользовательского HTML Убедиться, что через него нельзя выполнить скрипт
Аудит шаблона Найти обработчики и опасные адреса
Проверка чужого кода Оценить риски перед вставкой
Проверка после санитайзера Убедиться, что опасные конструкции удалены
Обучение Увидеть, какие конструкции считаются опасными

Флажок «Показать только замечания безопасности (XSS)» убирает ошибки разметки и оставляет только потенциально опасные конструкции.

Чем это отличается от валидатора W3C

Важное различие.

Этот валидатор W3C validator
Что проверяет Частые ошибки разметки и опасные конструкции Полное соответствие спецификации HTML
Полнота Основные проблемы Все правила стандарта
Безопасность Да, код никуда не отправляется Код отправляется на сервер W3C
XSS Отдельная проверка Не проверяет

Проверяются самые частые ошибки разметки и опасные конструкции, но не все правила спецификации. Для полной проверки на соответствие стандарту используйте validator.w3.org. Зато здесь код никуда не отправляется.

Безопасно ли вставлять чужой код

Да. Код не вставляется в страницу и не выполняется: он разбирается как текст, а результаты выводятся только как текст.

Это важно, потому что многие валидаторы вставляют проверяемый HTML в страницу, чтобы браузер его разобрал, — и тогда скрипт может выполниться. Здесь разбор идёт как текстовый, без выполнения.

Ограничения валидатора

  • Не все правила спецификации. Для полной проверки — W3C.
  • Лимит 500 000 символов. Очень большие страницы нужно проверять частями.
  • Не заменяет санитайзер. Валидатор находит опасные конструкции, но не очищает их. Для очистки нужен санитайзер.
  • Не проверяет CSS и JavaScript. Только HTML-разметка и конструкции в ней.

Как пользоваться: пошагово

  1. Вставьте HTML-код страницы или фрагмента.
  2. Если нужна только проверка на XSS, отметьте соответствующий флажок.
  3. Нажмите «Проверить» и исправьте замечания: у каждого указана строка.

Типичные ошибки

Считать, что валидатор заменяет W3C. Он проверяет частые ошибки, но не все правила стандарта.

Игнорировать замаскированные конструкции. javascript: выглядит безобидно, но браузер его декодирует и выполнит.

Вставлять чужой HTML в страницу для проверки. Валидатор этого не делает — он разбирает код как текст. Но другие инструменты могут вставлять.

Путать проверку с санитайзером. Валидатор находит опасные конструкции, но не удаляет их. Для очистки нужен санитайзер.

Проверять только разметку и забывать про XSS. Обработчики событий и javascript: — частая причина уязвимостей.

Забывать про лимит. Очень большие страницы нужно проверять частями.

Вопросы и ответы

Чем это отличается от валидатора W3C? Проверяются самые частые ошибки разметки и опасные конструкции, но не все правила спецификации HTML. Для полной проверки на соответствие стандарту используйте validator.w3.org. Зато здесь код никуда не отправляется.

Почему ссылка с javascript: считается опасной? Браузер сначала декодирует сущности, а затем выполняет адрес: javascript: превращается в javascript:. Так обходят фильтры, которые ищут слово javascript в исходном тексте. Валидатор декодирует значения так же, как браузер.

Безопасно ли вставлять сюда чужой код? Да. Код не вставляется в страницу и не выполняется: он разбирается как текст, а результаты выводятся только как текст.

Что такое XSS? Cross-Site Scripting — атака, при которой в страницу попадает JavaScript и выполняется в браузере пользователя. Валидатор помогает найти конструкции, через которые это возможно.

Можно ли проверить только XSS? Да, отметьте «Показать только замечания безопасности (XSS)» — ошибки разметки будут скрыты.

Заменяет ли валидатор санитайзер? Нет. Он находит опасные конструкции, но не очищает их. Для очистки нужен санитайзер.

Итог

HTML-валидатор и проверка XSS — инструмент для проверки HTML на незакрытые и лишние теги, неверную вложенность, повторяющиеся id и атрибуты, ошибки в сущностях и кавычках, а также на опасные конструкции с JavaScript: скрипты, обработчики, javascript: и data:, srcdoc, ,, в том числе замаскированные. Код не выполняется и не отображается, всё работает в браузере. Помните, что это не замена W3C и не санитайзер, но для быстрой проверки разметки и безопасности он даёт точную картину.

Предыдущая запись

Валидатор БЭМ: как проверить именование и вложенность классов в HTML

Онлайн-валидатор БЭМ проверяет, правильно ли названы и вложены блоки, элементы и модификаторы. Находит элементы вне блоков, «элементы элементов», модификаторы без основного класса, конфликты значений и опечатки в разделителях. Классическая схема и «два дефиса».
Далее