Экранировать весь HTML, кроме ‹br›

Я пытаюсь отобразить комментарии на странице и у меня возникли проблемы.

По сути, есть два разных типа комментариев, которые я пытаюсь обработать:

(1) Тип XSS.. например. <script type="text/javascript">alert('hi')</script>. С этим довольно легко справиться, экранировав его до того, как он попадет в базу данных, а затем запустив на нем stripslash и htmlentities.

(2) Комментарий с <br> обрывается. Когда данные сохраняются в базе данных, я запускаю на ней nl2br, поэтому данные выглядят как hi<br>hello<br><br>etc. Однако, когда я показываю этот комментарий, <br> не превращаются в разрывы страниц, как я хочу.

Любая идея, что делать? Я должен отметить, что отключение htmlentities исправляет второй тип, но первый тип затем выполняется как чистый html и отображает диалоговое окно с предупреждением.

Спасибо, Фил


person psarid    schedule 13.05.2011    source источник
comment
Вы пробовали strip_tags? php.net/manual/en/function.strip-tags.php   -  person Sam Dufel    schedule 13.05.2011


Ответы (2)


Один из способов: замените <br> заполнителем, например \n. Затем выполните htmlentities для очистки html-кода. Наконец, замените \n обратно на <br>, чтобы восстановить разрывы строк.

person mellamokb    schedule 13.05.2011
comment
хотя это не самое чистое решение, оно работает достаточно хорошо - спасибо. - person psarid; 13.05.2011

Если вы хотите удалить ненужные теги, попробуйте strip_tags. Он поддерживает allowable_tags, поэтому вы можете указать любые теги, которые вы не хотите удалять. Пример из руководства:

// Allow <p> and <a>
// you can add <br> if you want it not stripped
echo strip_tags($text, '<p><a>');

Поэтому после того, как вы преобразовали все \n в разрывы строк, вам не нужно беспокоиться о том, что они будут удалены. Может быть, это не то, что вы хотите, но надеюсь, что это дает представление.

person tradyblix    schedule 13.05.2011
comment
Вау, не знал, что такое существует. Спасибо за это! - person Xyan Ewing; 12.06.2012
comment
да, но он на самом деле разрывает тег ‹script› например, может быть, вы просто хотите, чтобы его экранировали, а не удаляли ... script, а в остальном все было нормально - person Master345; 23.06.2012