Лучшая практика: пользовательская очистка HTML - PullRequest
6 голосов
/ 05 мая 2010

Я кодирую ширину WYSIWYG-редактора designMode = "on" в iframe. Редактор работает нормально, и я храню код в базе данных.

Перед выводом html мне нужно «почистить» php на стороне сервера, чтобы избежать межсайтовых скриптов и других страшных вещей. Есть ли какая-то лучшая практика, как это сделать? Какие теги могут быть опасными?

ОБНОВЛЕНИЕ: опечатка исправлена, это то, что вы видите, то, что вы получаете. Ничего нового:)

Ответы [ 4 ]

5 голосов
/ 05 мая 2010

Лучшая практика - разрешать только определенные вещи, которые, как вы знаете, не опасны, и удалять / избегать всего остального. См. Статью Автоматическое обнаружение и удаление вредоносного кода в Интернете (OWASP AntiSamy) для обсуждения этого вопроса (библиотека предназначена для Java, но принципы применимы для любого языка).

3 голосов
/ 05 мая 2010

Если вы действительно хотите разрешить это, вы должны использовать подход белого списка.

Лучший подход, вероятно, состоит в том, чтобы запретить HTML и использовать вместо него упрощенный формат разметки; Вы можете предварительно визуализировать в HTML и сохранить его в базе данных, если производительность является проблемой. Избегание подобных проблем является одной из основных причин использования Уценка , Текстиль , reStructuredText и т. Д.

ПРИМЕЧАНИЕ : я связан с GitHub-ароматизированной уценкой (GFM), а не со стандартной уценкой (SM). GFM решает некоторые общие проблемы, которые возникают у конечных пользователей с SM.

1 голос
/ 05 мая 2010

Недавно я рассмотрел тот же вопрос с Perl, что и язык на стороне сервера.

При этом я наткнулся на Очиститель HTML , который может быть тем, что вы хотите. Но, очевидно, поскольку это на PHP, а не на Perl, я на самом деле не проверял это.

Кроме того, в своем исследовании я пришел к выводу, что это очень сложный бизнес, и по возможности рассмотрю использование упрощенного языка разметки, такого как Markdown, как предложил Хэнк Гей.

0 голосов
/ 05 мая 2010

Если вы знакомы с ASP .NET, просто выполните Server.htmlencode () для преобразования специальных символов, таких как <>, в "& g t;" "& l t;"

В php вы можете использовать функции htmlspecialchars ().

Как только специальные символы закодированы, межсайтовый скриптинг можно предотвратить.

...