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

Что умеет валидатор
HTML-валидатор и проверка XSS принимает HTML-код страницы или фрагмента и проверяет его по двум направлениям.
| Параметр | Что делает |
|---|---|
| HTML-код | Страница целиком или фрагмент, до 500 000 символов |
| Показать только замечания безопасности (XSS) | Отфильтровывает ошибки разметки, оставляет только опасные конструкции |
| Проверить | Запускает проверку |
Код не выполняется и не отображается: он разбирается как текст, а результаты выводятся только как текст. Всё выполняется в браузере: введённые данные никуда не отправляются.
Ошибки разметки, которые находит валидатор
Инструмент проверяет самые частые проблемы HTML.
| Ошибка | Пример | Почему это проблема |
|---|---|---|
| Незакрытый тег | без |
Браузер закроет сам, но структура может быть неверной |
| Лишний закрывающий тег | `` без открывающего | Ломает структуру документа |
| Неправильная вложенность | внутри |
Браузер исправит, но результат может отличаться от ожидаемого |
| Повторяющийся id | Два id="item" |
id должен быть уникальным на странице |
| Повторяющийся атрибут | Два class на одном теге |
Браузер возьмёт один, второй потеряется |
| Ошибка в сущности |   без ; |
Сущность не распознается |
| Ошибка в кавычках | Незакрытая кавычка в атрибуте | Атрибут разорвётся |
У каждого замечания указана строка — удобно исправлять.
Что такое XSS и почему это важно
XSS (Cross-Site Scripting) — атака, при которой в страницу попадает JavaScript и выполняется в браузере пользователя. Через него злоумышленник может украсть cookies, перенаправить на другой сайт, изменить содержимое страницы.
XSS возникает, когда пользовательские данные вставляются в HTML без экранирования. Валидатор помогает найти конструкции, через которые JavaScript может выполниться.
Опасные конструкции, которые отмечает валидатор
Инструмент ищет места, где может выполниться скрипт.
| Конструкция | Пример | Чем опасна |
|---|---|---|
| Скрипт | … |
Прямое выполнение кода |
| Обработчик события | onclick="…", onload="…" |
Выполняет код при событии |
Адрес javascript: |
`` | Выполняет код при клике |
Адрес data: |
`` | Может содержать HTML со скриптом |
srcdoc |
`` | Встраивает HTML со скриптом |
| |
Меняет базу для всех ссылок | |
| |
Перенаправляет на другой адрес |
Отдельно валидатор отмечает замаскированные конструкции — через сущности и пробелы. Например, javascript: выглядит безобидно в исходном тексте, но браузер декодирует сущность и выполнит javascript:.
Почему javascript: опасен
Это классический обход фильтров.
- Браузер получает адрес
javascript:alert(1). - Сначала декодирует сущности:
a— этоa. - Получается
javascript:alert(1). - Браузер выполняет код.
Фильтр, который ищет слово javascript в исходном тексте, такую конструкцию пропустит. Валидатор декодирует значения так же, как браузер, и поэтому находит замаскированные варианты.
Зачем проверять только XSS
Иногда ошибки разметки не важны, а безопасность — критична.
| Ситуация | Зачем фильтр XSS |
|---|---|
| Проверка пользовательского HTML | Убедиться, что через него нельзя выполнить скрипт |
| Аудит шаблона | Найти обработчики и опасные адреса |
| Проверка чужого кода | Оценить риски перед вставкой |
| Проверка после санитайзера | Убедиться, что опасные конструкции удалены |
| Обучение | Увидеть, какие конструкции считаются опасными |
Флажок «Показать только замечания безопасности (XSS)» убирает ошибки разметки и оставляет только потенциально опасные конструкции.
Чем это отличается от валидатора W3C
Важное различие.
| Этот валидатор | W3C validator | |
|---|---|---|
| Что проверяет | Частые ошибки разметки и опасные конструкции | Полное соответствие спецификации HTML |
| Полнота | Основные проблемы | Все правила стандарта |
| Безопасность | Да, код никуда не отправляется | Код отправляется на сервер W3C |
| XSS | Отдельная проверка | Не проверяет |
Проверяются самые частые ошибки разметки и опасные конструкции, но не все правила спецификации. Для полной проверки на соответствие стандарту используйте validator.w3.org. Зато здесь код никуда не отправляется.
Безопасно ли вставлять чужой код
Да. Код не вставляется в страницу и не выполняется: он разбирается как текст, а результаты выводятся только как текст.
Это важно, потому что многие валидаторы вставляют проверяемый HTML в страницу, чтобы браузер его разобрал, — и тогда скрипт может выполниться. Здесь разбор идёт как текстовый, без выполнения.
Ограничения валидатора
- Не все правила спецификации. Для полной проверки — W3C.
- Лимит 500 000 символов. Очень большие страницы нужно проверять частями.
- Не заменяет санитайзер. Валидатор находит опасные конструкции, но не очищает их. Для очистки нужен санитайзер.
- Не проверяет CSS и JavaScript. Только HTML-разметка и конструкции в ней.
Как пользоваться: пошагово
- Вставьте HTML-код страницы или фрагмента.
- Если нужна только проверка на XSS, отметьте соответствующий флажок.
- Нажмите «Проверить» и исправьте замечания: у каждого указана строка.
Типичные ошибки
Считать, что валидатор заменяет 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 и не санитайзер, но для быстрой проверки разметки и безопасности он даёт точную картину.