использование htmlpurifier для экранирования/фильтрации ввода или вывода

Я обрабатываю пользовательский ввод от публики с помощью редактора javascript WYSIWYG и планирую использовать htmlpurifier для очистки текста.

Я думал, что будет достаточно использовать htmlpurifier на входе, сохранить очищенный ввод в базе данных, а затем вывести его без дальнейшего экранирования/фильтрации. Но я слышал и другие мнения, что всегда следует избегать вывода.

Может кто-нибудь объяснить, почему мне нужно очищать вывод, если я уже очищаю ввод?


person Yehosef    schedule 24.05.2010    source источник


Ответы (3)


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

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

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

person Artefacto    schedule 24.05.2010
comment
Проблема с использованием редактора js заключается в том, что злоумышленник может отправить сообщение, минуя все проверки js. - person Yehosef; 24.05.2010
comment
@Col - да - но Artefacto говорил, что js проверяет html, поэтому нет необходимости дважды проверять (имеется в виду использование htmlpurifier) - person Yehosef; 24.05.2010
comment
Нет, он говорит, что вам не нужно снова проверять данные после считывания данных обратно из из базы данных. - person jvenema; 24.05.2010
comment
@Yehosef Нет. Вы должны проверить его после отправки (с помощью HTML Purifier, если хотите) и перед вставкой в ​​базу данных, но не каждый раз, когда вы извлекаете его из базы данных. - person Artefacto; 24.05.2010
comment
@artefacto - спасибо за разъяснение и ответ - я не прочитал его должным образом - person Yehosef; 24.05.2010

Чтобы быть на 100% безопасным, используйте HTMLPurifier дважды. Перед сохранением HTML в БД и перед выводом на экран.
Огромным недостатком такого решения является производительность. HTMLPurifier очень медленный при фильтрации HTML, и вы можете столкнуться с более длительным временем обработки ваших страниц.

Вы должны быть в порядке, если вы выполняете только 1-2 фильтрации перед выводом чего-либо на экран, но если вы выполняете 10 фильтров на запрос, как мы, мы решили не использовать HTMLPurifier при выводе большого количества текстов, чтобы сохранить.

HTMLPurifier занимал 60% времени обработки каждого запроса, и вместо этого мы хотели добиться меньшего времени отклика и более высокого UX.

Это зависит от вашей ситуации. Если вы можете позволить себе использовать HTMLPurifier перед выводом, сделайте это - это лучше, и вы всегда можете контролировать, какие теги вы хотите разрешить (для нового и даже для старого контента, хранящегося в вашей базе данных).

person mike    schedule 24.05.2010
comment
Спасибо за ваш пост, но можете ли вы объяснить случай, когда мне нужно будет сделать это дважды? например, если я это сделаю: $id = (int)$_POST['id']; $db-›query(выбрать * из пользователей, где id = .int_val($id)); я получил что-нибудь в безопасности? - person Yehosef; 24.05.2010
comment
Вторая фильтрация (перед выводом) полезна в тех случаях, когда кто-то взломал ваш сервер БД, но не смог взломать ваш веб-сервер. Злоумышленник может легко изменить любой контент в вашей базе данных, и если вы не фильтруете HTML перед выводом, у вас довольно серьезная проблема с безопасностью. Однако я считаю, что это очень редкий сценарий. - person mike; 24.05.2010
comment
это смехотворный сценарий я бы сказал - person Your Common Sense; 24.05.2010
comment
Я согласен, это бывает редко, но побочный эффект фильтрации перед выводом также заключается в том, что если вы решите, что больше не хотите разрешать определенный тег (например, ‹img›), это довольно просто для всего вашего контента. Если бы не было фильтрации перед выводом, вам пришлось бы просматривать каждую запись и удалять теги. - person mike; 24.05.2010

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

person Edward Z. Yang    schedule 24.05.2010
comment
спасибо за ответ, но я не совсем понял - вы говорите, что после использования htmlpurifier его можно считать безопасным? - person Yehosef; 24.05.2010
comment
Я думаю, это зависит от контекста. Если вы разрешаете пользователям писать сообщения в блоге, вы используете HTMLPurifier, чтобы решить, какие теги им разрешено использовать. После этого вам нужен этот HTML-вывод в виде HTML. Вы не хотите рассматривать его как текст, который делает экранирование, иначе, если пользователь выделил слово жирным шрифтом, оно будет экранировано и показано как ‹b›word‹/b›. Возможно, Эдвард вернется, чтобы подтвердить мой комментарий. - person joedevon; 21.11.2010