Мне нужно реализовать простой и эффективный фильтр XSS на C ++ для CppCMS. Я не могу использовать существующие высококачественные фильтры, написанные на PHP, потому что это высокопроизводительный фреймворк, использующий C ++.
Основная идея состоит в том, чтобы предоставить фильтр со списком HTML-тегов и белым списком параметров для этих тегов. Например. типичный ввод HTML может состоять из <b>
, <i>
, тегов и <a>
тега с href
. Но простой реализации недостаточно, потому что даже разрешенные простые ссылки могут включать XSS:
<a href="javascript:alert('XSS')">Click On Me</a>
Есть много других примеров, которые можно найти здесь. Итак, я подумал также о возможности создать белый список префиксов для тегов, таких как href / src, поэтому мне всегда нужно проверять, начинается ли он с (https?|ftp)://
Вопросы:
- Достаточно ли этих предположений для большинства целей? Это означает, что если я не дам параметры для тегов
style
и проверю src / href с использованием белого списка префиксов, это решит проблемы XSS? Есть ли проблемы, которые нельзя исправить таким способом? - Есть ли хороший справочник по формальной грамматике HTML / XHTML, чтобы написать простой синтаксический анализатор, который очищал бы все неправильные или запрещенные теги, такие как
<script>