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

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

person Artyom    schedule 15.02.2009    source источник


Ответы (3)


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

person dr. evil    schedule 15.02.2009

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

person Kornel    schedule 09.04.2009

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

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

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

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

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

person Chad Birch    schedule 09.04.2009