Как мне отфильтровать опасный HTML, как это делает SO?

Я хочу разместить на своем сайте HTML-редактор, но не хочу подвергаться атакам xss или другим видам атак, связанных с разрешением пользовательского HTML.

Это очень похоже на то, что делает Stack Overflow. Как здесь проверяется / дезинфицируется HTML, чтобы информация о стилях оставалась, а другие, более опасные вещи (например, javascript, iframe и т. Д.) Не попадали?

Есть ли библиотеки (желательно на PHP), которые это уже делают?


person Dexter    schedule 24.03.2012    source источник
comment
Наверное, лучше спросить на meta.stackoverflow.com   -  person Andreas Wong    schedule 24.03.2012
comment
Самый простой способ - использовать список известных безопасных и разрешенных тегов HTML, а не пытаться отфильтровать плохие вещи.   -  person Simeon Visser    schedule 24.03.2012
comment
@ j08691, andreas: Тот факт, что вопрос использует SO в качестве примера, не делает его автоматически мета-вопросом.   -  person BoltClock    schedule 24.03.2012
comment
HTMLPurifier сделает свое дело; htmlpurifier.org   -  person Pieter    schedule 24.03.2012
comment
@Simeon Visser: да, но остается открытым вопрос о том, как на самом деле проверить html. BoltClock Да, спасибо. Речь идет не конкретно о ТАК, я просто выбрал это как наиболее знакомый пример того, чего я пытаюсь достичь.   -  person Dexter    schedule 24.03.2012
comment
Общая идея состоит в том, чтобы разрешить только некоторые HTML-теги (и некоторые атрибуты).   -  person hakre    schedule 24.03.2012


Ответы (4)


В PHP есть функция strip_tags, которая удаляет теги HTML и PHP из строки и позволяет указать определенные допустимые теги. Но, как заявляет @webarto, существуют библиотеки, которые справляются с этим лучше.

Из Руководства по PHP.

person Whymarrh    schedule 24.03.2012
comment
Это не решение ... htmlpurifier.org - person Dejan Marjanović; 24.03.2012
comment
@webarto как написать, например, > и <, но сделать их видимыми в результате? - person Roko C. Buljan; 24.03.2012
comment
@ RokoC.Buljan htmlspecialchars или _2 _... - person Dejan Marjanović; 24.03.2012
comment
@Roko C. Buljan: Поскольку ввод уже находится в HTML, пользователь (или редактор HTML на странице), набирающий контент, должен будет позаботиться об экранировании таких вещей, как ‹. - person Dexter; 24.03.2012
comment
strip_tags сам по себе не отвечает на вопрос правильно, так как он не изменяет атрибуты тега. Атрибуты тега все еще можно злоупотреблять, если вы используете только этот метод. Убедитесь, что любое решение, которое вы в конечном итоге используете, дезинфицирует также такие атрибуты, как onmouseover, href, onclick ... Лучшая дезинфекция - это не дезинфекция, если она соответствует вашим потребностям, подумайте об использовании простой альтернативы, такой как уценка с включенным безопасным режимом. - person eymen; 11.12.2015

Вы можете использовать

strip_tags($yourData,"<a><p><div><i>") // more tags you want to keep;

Если вы тоже используете SQL, используйте

mysql_real_escape_string($data);

Это действительно все, что вам нужно, чтобы избежать укола. Помните, что при использовании настоящего выхода mySQL вам необходимо использовать косые черты, чтобы удалить их, когда вы выводите их эхом.

Вот документы для полосных тегов и документы для mysql escape.

person Jordan Schnur    schedule 14.03.2013

Если вы хотите разрешить некоторый (X) HTML и ограничить только те теги, которые рассматриваются как небезопасные, вы можете использовать что-то вроде KSES. Wordpress использует подобное решение.

http://sourceforge.net/projects/kses/

person technosis    schedule 22.03.2013

В дополнении к сообщению Whymarrh предлагается разместить код в подпапке вашего сайта и автоматически изменять любой код, содержащий «..», или «http: //», или любые команды mysql.

person lilHar    schedule 13.03.2013
comment
Это следует публиковать как комментарий, а не как отдельный ответ. - person brbcoding; 13.03.2013