Написание XSS-фильтра для (X) HTML на основе белого списка - PullRequest
3 голосов
/ 15 февраля 2009

Мне нужно реализовать простой и эффективный 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>

Ответы [ 3 ]

4 голосов
/ 15 февраля 2009

Вы можете взглянуть на проект 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.

1 голос
/ 09 апреля 2009

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

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

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

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

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

1 голос
/ 09 апреля 2009

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

...