Предотвратить XSS с помощью strip_tags ()? - PullRequest
12 голосов
/ 31 августа 2010

У меня есть веб-приложения на PHP. Я НЕ хочу разрешать пользователям публиковать HTML на моем сайте.

Если я просто запускаю strip_tags () для всех данных перед сохранением в базу данных, будет ли достаточно strip_tags (), чтобы предотвратить XSS?

Я спрашиваю, потому что мне непонятно читать документацию по strip_tags , если XSS запрещен. Кажется, есть какая-то ошибка с браузером, допускающим <0/script> (да, ноль) в качестве допустимого HTML.

UPDATE

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

Ответы [ 6 ]

18 голосов
/ 10 декабря 2010

Я категорически не согласен, что это "академически лучше".

  • Это нарушает пользовательский ввод (представьте, насколько бесполезным будет StackOverflow для этого обсуждения, если они «очистят» сообщения от всех тегов).

  • Текст, вставленный в HTML с удаленными только тегами, будет недействительным. HTML также требует экранирования &.

  • Это даже не безопасно в HTML! strip_tags() недостаточно для защиты значений в атрибутах, например, <input value="$foo"> может использоваться с $foo = " onfocus="evil() (без <, > необходимо!)

Таким образом, правильное решение - экранировать данные в соответствии с требованиями языка, который вы генерируете. Если у вас есть простой текст и вы генерируете HTML, вам следует конвертировать текст в HTML с htmlspecialchars() или около того. Когда вы генерируете электронную почту, вы должны конвертировать текст в формат для цитирования и т. Д.

12 голосов
/ 31 августа 2010

strip_tags само по себе недостаточно, поскольку оно удаляет совершенно корректный контент, отличный от HTML.Например:

<?php
 echo strip_tags("This could be a happy clown *<:) or a puckered face.\n");
 ....
 echo strip_tags("Hey guys <--- look at this!\n");

Будет выводить:

This could be a happy clown *

И:

Hey guys

Все после начального < будет удалено.Очень раздражает для конечных пользователей!Запрет зарезервированных символов HTML был бы плохим ходом.И эти символы должны быть экранированы с помощью htmlentities или аналогичной функции при использовании встраиваемого в HTML.

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

5 голосов
/ 31 августа 2010

Как уже упоминалось, вы можете использовать комбинацию strip_tags и htmlspecialchars, чтобы защитить себя от XSS.

Одна плохая вещь в strip_tags заключается в том, что он может удалять безвредный контент, который пользователь не ожидает. Я вижу, что технические специалисты пишут такие вещи, как: <edit> foo </edit>, где они полностью ожидают, что эти теги будут видны как есть. Кроме того, я видел, что «нормальные» люди даже делают такие вещи, как <g> для «улыбки». Опять же, они подумают, что это ошибка, если она не появляется.

Так что лично я избегаю strip_tags в предпочтении моего собственного анализатора, который позволяет мне явно включать определенные безопасные теги HTML, атрибуты и CSS, явно отключать небезопасные теги и атрибуты и преобразовывать любые другие специальные символы в безопасные версии. Таким образом, текст всегда выглядит так, как можно было бы ожидать.

Если бы в моем распоряжении не было этого парсера, я бы просто использовал htmlspecialchars для безопасного кодирования текста.

3 голосов
/ 31 августа 2010

Должно быть, я никогда раньше не слышал об этом трюке. Но вы всегда можете сделать strip_tags и затем htmlspecialchars просто для безопасности. Хорошей практикой было бы проверить это самостоятельно в своем приложении, так как вы знаете, какой тип данных вы можете попробовать ввести и протестировать, и посмотрите, не нарушит ли оно это. Просто найдите методы XSS-эксплойтов и используйте их для своих тестовых данных. Я бы проверял, по крайней мере, еженедельно на наличие новых уязвимостей и постоянно проверял ваш сценарий на наличие новых эксплойтов.

1 голос
/ 31 августа 2010

strip_tags() может помочь, но это не пуленепробиваемый. Так как он не проверяет HTML, который он удаляет, какой-то умный человек найдет HTML-конструкцию (искаженную или иным образом), которая будет удалена и все же приведет к чему-то неприятному. Но на данный момент он должен обрабатывать большинство всего, что бросается на него. Только не думай, что так будет всегда.

Кроме того, если вы разрешите прохождение каких-либо тегов через параметр «допустимые теги», он пропустит любые специфичные для javascript атрибуты, такие как onclick для этих конкретных тегов.

0 голосов
/ 12 февраля 2019

Нужна помощь в обработке html как простого текста в документе?Необходимо echo значение атрибута, не будучи уязвимым для атак XSS, таких как <input value="<?php echo '" onkeydown="alert(&quot;XSS&quot;)'; ?>" />?

Использование htmlentities().

echo htmlentities('<p>"..."</p>');
// result: &lt;p&gt;&quot;...&quot;&lt;/p&gt;

Нет strip_tags() требуется, так как эта функция уже заменяет < и > сущностями &lt; и &gt;.

Какую разницу между htmlentities() и htmlspecialchars() вы можете спросить?

Ну, htmlentities() будет кодировать ЛЮБОЙ символ, который имеет эквивалент HTML-объекта ,

, тогда как htmlspecialchars() ONLY кодирует небольшой набор наиболее проблемных символов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...