Передовой опыт: очистка пользовательского HTML

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

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

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


person Martin    schedule 05.05.2010    source источник
comment
Если вы решили реализовать это самостоятельно, вам лучше взглянуть на ha.ckers.org/ xss.html — список известных атак в различных браузерах.   -  person FalseVinylShrub    schedule 06.05.2010
comment
Отличный вопрос - мне было интересно, как stackoverflow защищает себя...   -  person JDelage    schedule 25.03.2011


Ответы (4)


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

person Chris Lercher    schedule 05.05.2010
comment
Я начал таким образом, но поскольку все браузеры реализуют этот материал по-разному, я получу много тегов для одного и того же, что мне нужно разрешить. Например, полужирный текст делается как минимум тремя разными способами. Так что это будет огромный набор регулярных выражений. Также можно вставить любой отформатированный html в редакторе, например, из html-почты или чего-то еще. И это хорошо выглядит в редакторе, но не будет работать после побега. - person Martin; 05.05.2010
comment
Вот почему AntiSamy уже поставляется с некоторыми наборами примеров. Вероятно, есть еще библиотека PHP (или вы можете создать ее?). Вы никогда не добьетесь этого наоборот (занесением в черный список): все, кто пробовал это раньше, потерпели неудачу - это просто нереально - будет что-то, что вы не охватили (что фатально для внесения в черный список, но не имеет большого значения для внесения в белый список). В идеале, если вы можете избежать HTML, используйте Markdown и т. д., как предложил Хэнк! - person Chris Lercher; 05.05.2010
comment
@Martin, тебе ДЕЙСТВИТЕЛЬНО не следует использовать для этого регулярные выражения. Есть причина, по которой этот ответ получил (нетто) 3000 голосов. - person Hank Gay; 05.05.2010
comment
Хорошо, теперь я убежден, что мне следует внести в белый список, а не в черный список. @Hank Gay: Но на самом деле я не собираюсь разбирать html, я просто заменю ‹ на , а затем заменю обратно на ‹ в небольшом наборе известных шаблонов. Это все еще похоже на свидание с сатаной? - person Martin; 06.05.2010

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

Наилучший подход, вероятно, состоит в том, чтобы запретить HTML и вместо этого использовать упрощенный формат разметки; вы можете выполнить предварительный рендеринг в HTML и сохранить его в базе данных, если вас беспокоит производительность. Избежать подобных проблем — одна из основных причин использования Markdown, Текстиль, reStructuredText и т. д.

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

person Hank Gay    schedule 05.05.2010

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

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

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

person FalseVinylShrub    schedule 05.05.2010

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

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

После кодирования специальных символов межсайтовый скриптинг можно предотвратить.

person TechTravelThink    schedule 05.05.2010
comment
Но это отключает html, я хочу разрешить html, но удалить опасные теги, такие как iframe и script. - person Martin; 05.05.2010
comment
Затем используйте разметку, специально разработанную для этой цели, например, bbcode или wikicode, и подходящий редактор. - person symcbean; 05.05.2010