Обеспечение безопасности пользовательских HTML-шаблонов. - PullRequest
3 голосов
/ 01 марта 2010

Я хочу позволить пользователям создавать крошечные шаблоны, которые я затем отображаю в Django с предопределенным контекстом. Я предполагаю, что рендеринг Django безопасен (я задавал вопрос об этом до ), но все еще существует риск межсайтового скриптинга, и я хотел бы предотвратить это. Одним из основных требований этих шаблонов является то, что пользователь должен иметь некоторый контроль над макетом страницы, а не только над ее семантикой. Я вижу пару решений:

  • Разрешить пользователю использовать HTML, но на последнем шаге вручную отфильтровывать опасные теги (например, <script> и <a onclick='..'>. Я не очень восторженно отношусь к этой опции, потому что боюсь, что могу пропустить некоторые теги. Даже в этом случае пользователь все еще может использовать абсолютное позиционирование на <divs>, чтобы испортить одну или две вещи на остальной части страницы.
  • Используйте язык разметки , который создает безопасный HTML. Из того, что я вижу, в большинстве языков разметки я могу удалить любой HTML, а затем обработать результат. Проблема в том, что большинство языков разметки не очень мощные в плане компоновки. Насколько я мог видеть, нет способа центрировать элементы в Markdown, даже в ReST. Преимущество в том, что некоторые языки разметки хорошо документированы, и пользователи могут уже знать, как их использовать.
  • Придумайте какую-нибудь фирменную разметку. Минусы, которые я здесь вижу, в значительной степени подразумеваются словом проприетарным .

Итак, подведем итог: есть ли какой-нибудь безопасный и простой способ «очистить» HTML & # x2014; предотвращение xss & # x2014; или - это достаточно вездесущий язык разметки, который дает некоторый контроль над макетом и стилем.

Ресурсы:

Ответы [ 4 ]

3 голосов
/ 01 марта 2010

Увидев ответ Пекки, я попытался быстро найти эквивалент Google Purifier в Python. Вот что я придумал: Python HTML Sanitizer . На первый взгляд, это выглядит довольно хорошо для меня.

1 голос
/ 01 марта 2010

"Используйте язык разметки, который создает безопасный HTML."

Очевидно, единственный разумный подход.

«Проблема в том, что большинство языков разметки не очень мощны в плане компоновки».

Ложные.

"нет способа центрировать элементы в ReST."

Ложные.

Центрирование - это стиль - функция CSS, а не функция разметки.

  1. Желание центрироваться - назначить класс CSS для фрагмента текста. Директива .. class:: делает это.

  2. Вы также можете определить свою собственную интерпретируемую роль текста, если это необходимо для указания встроенного класса на фрагменте <span> разметки.

1 голос
/ 01 марта 2010

На основе PHP Очиститель HTML , я сам еще не использовал его, но слышал об этом очень хорошие вещи. Они много обещают:

HTML Purifier соответствует стандартам Библиотека HTML-фильтров написана на PHP. HTML Purifier не только удалит все вредоносные код (более известный как XSS) с тщательно проверенным, безопасный, но разрешительный белый список, это также проверит ваши документы соответствие стандартам, что-то достижимое только с всестороннее знание спецификаций W3C.

Может быть, стоит попробовать, хотя он не основан на Python. Обновление: @Matchu нашел альтернативу на основе Python, которая тоже выглядит хорошо.

Однако у вас будет много очень сложных краевых случаев, просто подумайте о встраивании Flash. Кроме того, злонамеренное использование position: absolute чрезвычайно трудно отследить (есть position: relative, который может достичь того же эффекта, но также может быть вполне законным инструментом верстки.) Может быть, посмотрите, что, например, разрешает EBay, и не разрешать? Если у кого-то есть необходимый опыт, чтобы знать, что опасно, а что нет, из миллионов примеров, он знает.

Связанные ресурсы на EBay:

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

0 голосов
/ 01 марта 2010

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

Более сложная задача - предотвратить систему шаблонов от бесконечных циклов и рекурсии. Это явная угроза для производительности системы, но в зависимости от настроек реализации и развертывания сервер может никогда не отключиться. Имея в своем распоряжении ограниченное количество потоков Python, повторные вызовы некорректно работающего шаблона могут быстро вывести ваш сайт из строя.

...