Предотвратить XSS с помощью strip_tags ()?

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

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

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

ОБНОВИТЬ

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

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

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

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

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

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

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 или аналогичной функции при использовании inline с HTML.

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

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

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

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

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

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

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

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