Фильтрация пользовательского ввода в PHP - PullRequest
0 голосов
/ 23 июня 2009

В настоящее время я работаю над приложением, которое требует, чтобы пользователи отправляли сообщения и комментарии, которые отображаются на сайте. Поскольку мы все знаем, что пользовательскому вводу нельзя доверять, я использовал htmlspecialchars ($ string, ENT_QUOTES) для обработки сообщений и комментариев пользователя.

Теперь я хочу, чтобы некоторые определенные теги HTML игнорировались. такие как <b><br /> и еще несколько тегов. Как я могу это сделать, чтобы htmlspecialchars игнорировал некоторые теги, а другие - фильтровал.

Ответы [ 6 ]

3 голосов
/ 23 июня 2009

решение а)
используйте strip_tags, установленные в htmlspecialchars, и внесите в белый список необходимые теги.
лучшее решение б)
Используйте bbcodes и присваивайте псевдонимы нужным тегам, например: [b] полужирный [/ b]

2 голосов
/ 23 июня 2009

Устали от использования BBCode из-за текущей ситуации с недостаточными или небезопасными фильтрами HTML?
-> Очиститель HTML
HTML Purifier - это стандартная библиотека HTML-фильтров, написанная на PHP. HTML Purifier не только удалит весь вредоносный код (более известный как XSS) с тщательно проверенным, безопасным, но разрешающим белым списком, ...
2 голосов
/ 23 июня 2009

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

Я бы действительно рекомендовал избегать этого и использовать что-то, генерирующее HTML, такое как этот анализатор кода UBB (или аналогичный). Или даже Уценка (с отключенной опцией HTML).

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

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

1 голос
/ 23 июня 2009

Вы можете заменить строку в кавычках, чтобы повторно вставить разрешенные теги. Для тегов <b>, например:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

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

0 голосов
/ 23 июня 2009

Это не так просто, как вы могли бы подумать, потому что ни htmlspecialchars(), ни htmlentities() не предоставляют опций для игнорирования определенных тегов (обе функции даже не знают значение понятия теги ).

Вы можете использовать некоторые другие средства, чтобы позволить пользователям форматировать свои сообщения, например, BBCode , Текстиль или Уценка . Для всех них доступны парсеры PHP.

Если вам придется придерживаться html-тегов, вы можете прибегнуть к некоторой предварительной обработке, которая переформатирует разрешенные теги, чтобы на них не влиял htmlspecialchars(). Затем вы можете постобработать результат, чтобы изменить формат обратно на обычные HTML-теги. Следующий пример визуализирует этот процесс для простого тега <a>. Имейте в виду, что обработка HTML с помощью регулярных выражений подвержена ошибкам и не всегда является подходом. Я буду использовать его только для простоты в этом примере.

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Это не проверено и, безусловно, потребует гораздо больше работы.

0 голосов
/ 23 июня 2009

Я настоятельно рекомендую вам использовать Zend_Filter для фильтрации пользовательского ввода В частности, см .: http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.using

...