tags — Will leaving/creating a space () reduce the threat of XSS?

#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-объекты.