Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Устали от использования BBCode из-за текущей ситуации с несовершенными или небезопасными фильтрами HTML?
- > очиститель HTML

HTML Purifier - это стандартная библиотека HTML-фильтров, написанная на PHP. HTML Purifier не только удалит весь вредоносный код (более известный как XSS) с тщательно проверенным, безопасным, но разрешающим белым списком, ...

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top