Написание XSS-фильтра для (X) HTML на основе Белого списка

StackOverflow https://stackoverflow.com/questions/551480

Вопрос

Мне нужно реализовать простой и эффективный XSS-фильтр на C ++ для CppCMS ( CppCMS ).Я не могу использовать существующие высококачественные фильтры написан на PHP, потому что это высокопроизводительный фреймворк, использующий C ++.

Основная идея заключается в предоставлении фильтра, который содержит список HTML-тегов while и белый список опций для этих тегов.Например.типичный ввод 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>
Это было полезно?

Решение

Вы можете взглянуть на проект Anti Samy, пытающийся достичь того же самого.Хотя это Java и .NET.

Правка 1, немного дополнительная :

Потенциально вы можете составить очень строгий белый список.Он должен быть хорошо структурирован и должен быть довольно плотным и не слишком гибким.Когда вы сочетаете гибкость, такое количество тегов, атрибутов и разных браузеров, как правило, вы сталкиваетесь с уязвимостью XSS.

Я не знаю, каковы ваши требования, но я бы выбрал строгую и простую поддержку тегов (только b li h1 и т.д.), А затем строгую поддержку атрибутов на основе тега (например, src допустим только под тегом href), затем вам нужно внести белый список в значения атрибутов, как вы указали http | https | ftp или style ="color | background-color" и т.д.

Рассмотрим этот:

<x style="express/**/ion:(alert(/bah!/))">

Также вам нужно подумать о каком-нибудь белом списке символов или какой-нибудь нормализации UTF-8, потому что разные кодировки могут вызвать неудобные проблемы.Например, новые строки в атрибутах, недопустимые последовательности UTF-8.

Другие советы

Все детали синтаксического анализа HTML следующие указан в HTML 5.Однако его реализация требует довольно большой работы, и не имеет значения, будете ли вы точно анализировать HTML со всеми угловыми примерами.В худшем случае у вас получится другой DOM, но вы все равно должны очистить DOM.

Как вы упомянули, существуют различные реализации этого на PHP, но я не знаю ни одной на C ++, поскольку это не тот язык, который обычно применяется для веб-разработки.В целом, это будет зависеть от того, насколько сложную реализацию вы хотите придумать.

Очень ограниченный белый список, вероятно, является "самым простым" способом, но если вы хотите быть действительно всеобъемлющим, я бы рассмотрел возможность преобразования одной из установленных версий в C ++, в отличие от попыток написать свою собственную с нуля.Есть так много хитростей, о которых стоит беспокоиться, что, я думаю, вам было бы лучше встать на плечи других, которые уже прошли через все это.

Я ничего не знаю об использовании C ++ для веб-разработки, но преобразование PHP в него не кажется особенно сложной задачей, PHP на самом деле не обладает какими-либо волшебными возможностями, которые C ++ не смог бы дублировать.Я уверен, что будут некоторые небольшие заминки, но в целом, если вы хотите пойти более сложным путем, преобразование определенно все равно будет быстрее, чем полный дизайн с нуля.

Очиститель HTML похоже, что сильная реализация PHP, которая все еще активно поддерживается, есть сравнительный документ где автор обсуждает некоторые различия между своим подходом и подходами других, вероятно, стоит прочитать.

Что бы вы ни придумали, обязательно протестируйте это со всеми примерами, на которые вы ссылаетесь, и убедитесь, что оно соответствует всем этим требованиям.Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top