Защита от эксплойтов XSS?

Я новичок в PHP, но я слышал, что XSS-эксплоиты плохие. Я знаю, что это такое, но как защитить свои сайты?

Чтобы предотвратить атаки XSS, вам просто нужно проверить и правильно проверить все введенные пользователем данные, которые вы планируете использовать, и не разрешать вставлять код html или javascript из этой формы. Или вы можете использовать htmlspecialchars () для преобразования HTML-символов в объекты HTML. Поэтому символы, такие как <>, которые отмечают начало / конец тега, превращаются в объекты html, и вы можете использовать strip_tags (), чтобы разрешать только теги, поскольку функция не выделяет вредные атрибуты, такие как onclick или onload.

Удалите все пользовательские данные (данные в базе данных от пользователя) с помощью функции htmlentities () .

Для данных HTML (например, из редакторов WYSIWYG) используйте Очиститель HTML, чтобы очистить данные, прежде чем сохранять их в базе данных.

strip_tags() если вы не хотите иметь никаких тегов вообще. Что-то вроде <somthinghere>
htmlspecialchars() будет htmlspecialchars() их до html, поэтому браузер будет показывать и не запускать.
Если вы хотите разрешить хороший html, я бы использовал что-то вроде htmLawed или htmlpurifier

Плохие новости

К сожалению, предотвращение XSS в PHP – это нетривиальное обязательство.

В отличие от SQL-инъекций , которые вы можете смягчить с помощью подготовленных операторов и тщательно отобранных белых списков, нет надежного способа отделить информацию, которую вы пытаетесь передать в свой HTML-документ, из остальной структуры документа.

Хорошие новости

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

Самое важное правило, которое следует иметь в виду: всегда избегайте выхода, никогда на входе. Вы можете безопасно кэшировать свой экранированный вывод, если вас беспокоит производительность, но всегда сохраняйте и управляйте данными без сохранения.

Стратегии снижения XSS

В порядке предпочтения:

  1. Если вы используете механизм шаблонов (например, Twig, Smarty, Blade), убедитесь, что он предлагает контекстно-зависимое экранирование. Я знаю по опыту, что делает Твиг. {{ var|e('html_attr') }}
  2. Если вы хотите разрешить HTML, используйте HTML Purifier . Даже если вы считаете, что принимаете только Markdown или ReStructuredText, вы все равно хотите очистить HTML эти языки разметки.
  3. В противном случае используйте htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset) и убедитесь, что в остальной части вашего документа используется тот же набор символов, что и $charset . В большинстве случаев 'UTF-8' является желаемым набором символов.

Почему я не должен фильтровать вход?

Попытка фильтровать XSS на входе – это преждевременная оптимизация , которая может привести к неожиданным уязвимостям в других местах.

Например, недавняя уязвимость WordPress XSS использовала усечение столбца MySQL, чтобы разорвать их стратегию экранирования и предотвратить несанкционированное сохранение преждевременно экранированной полезной нагрузки. Не повторяйте свою ошибку.