#php #xss #sanitization
#php #xss #очистка
Вопрос:
Я создаю виджет чата для своего веб-сайта. Пользователи смогут вводить прямой текст — без html.
В попытке устранить теги HTML И разрешить пользователям использовать «<» и «>», я беру их входные данные и очищаю их с помощью strip_tags() на входе и htmlentities() на выходе на экраны пользователей — с использованием php. Одна из проблем заключается в том, что если пользователь вводит «Россия
Мой вопрос… если я использую регулярное выражение для создания пробела между «<» и следующим символом, не являющимся пробелом, поможет ли это мне устранить угрозу XSS? Будет ли это препятствовать отображению потенциального HTML-тега на экране пользователя?
Скажем, если что-то подобное проскальзывает:
<script type=’text/javascript’>предупреждение (‘некоторый вредоносный код’);< /script>
Одним из преимуществ создания этого пробела (например, < script… > ), по-видимому, является то, что strip_tags() оставит «<» в покое.
Спасибо за любые предложения.
Комментарии:
1.
stripTags()
Вы имеете в видуstrip_tags()
? Кроме того, что, если ваше регулярное выражение завершится ошибкой?<<script>
, например2. да, strip_tags() . Спасибо. Я думаю, что я бы сделал preg_replace() (глобальный), чтобы добавить пробел после каждого «<«. Тогда я бы сделал strip_tags() на входе, чтобы быть уверенным. Я предполагаю, что strip_tags() оставит в покое что-то вроде «Россия < Китай». Я надеялся, что «< script>» не будет представлять угрозу XSS, но моя интуиция подсказывает мне, что я не должен быть так уверен в этом……
3. Я выполняю htmlentities() для всего, что я выводю из базы данных MySQL (записи пользователя) в браузер пользователя.
4. Вы могли бы это протестировать .
5. Как насчет <img src=»nonexistent.gif » onerror=»вредоносный javascript»>? Используйте HTML-экранирование, не удаляйте теги. Пользователи должны быть допущены к обсуждению <script> tags in the chat? Я думаю, что сообщение в чате, в том числе «<script>» is a valid chat message. Но я хочу, чтобы он отображался как текст, а не HTML, поэтому мне нужно избегать любого HTML, который там есть.
Ответ №1:
Добавленного пространства достаточно, чтобы теги не удалялись strip_tags
и не отображались браузерами в виде HTML.
Но в какой именно момент вы бы использовали такое регулярное выражение? Если вы добавите его после того, как закончите strip_tags()
, допустимый текст уже будет удален. Если вы добавите его раньше strip_tags()
, не останется никаких тегов для удаления, поэтому пользователи будут видеть разделенные HTML-теги в тексте.
Но если они все равно будут видеть (искаженные) теги, зачем вы вообще это делаете? Вы можете просто сделать htmlspecialchars()
, что вам все равно нужно делать.
Даже синтаксический анализатор HTML вам не поможет, потому что синтаксический анализатор HTML также рассмотрит <China
в вашем примере тег.
И человек, набирающий a<b
текст, сравнивает, говорит о HTML, пытается добавить акцент или пытается внедрить вредоносный скрипт?
Комментарии:
1. Человек будет сравнивать — например, Ларри Берд Этот мем на доске объявлений довольно популярен, и я хотел бы разрешить пользователям использовать его, если это возможно. Мой стимул для использования strip_tags() взят из статьи, написанной Крисом Шифлеттом, в которой рекомендуется использовать «зрелую» функцию PHP для очистки ввода. Вы правильно поняли, что нужно просто оставить все как есть и отобразить его в выходных данных (экранированный с помощью / htmlentities()/htmlspecialchars()). Это, безусловно, идентифицировало бы любого, кто пытается вставить код XSS в свои входные данные, не так ли ?!
2.@broncozr Действительно, это было бы. И если это все равно не особенно технический сайт, скорее всего, не будет размещено много HTML. И люди, которые пытаются, достаточно быстро обнаружат, что это не работает… Вам действительно нужно подумать только об очистке ввода, если вы действительно хотите разрешить некоторый HTML.
3. @broncozr О, и Крис Шифлетт также сказал : «Я ненавижу комментировать блоги, где мой комментарий передается через что-то вроде strip_tags() , эффективно искажая то, что я пытаюсь сказать». 😉
4. ha. Ну, это была довольно старая статья, которую я прочитал, IIRC . Спасибо за вашу помощь.
Ответ №2:
Просто используйте htmlspecialchars() . Это единственная функция, которая вам нужна для очистки HTML. Угрозы XSS уничтожаются при условии, что вы используете его разумно. Выполните это с помощью nl2br, если вы хотите отобразить несколько строк, иначе текст будет отображаться в одной строке.
strip_tags никогда, никогда, никогда не является подходящей функцией для очистки HTML. В лучшем случае он съест или исказит определенный допустимый текст. В худшем случае, если используется параметр allowed_tags , он ничего не очистит, потому что атрибуты сохраняются. Это также не предотвращает HTML-объекты.