Я новичок в 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-документ, из остальной структуры документа.
Тем не менее, вы можете смягчить известные атаки, проявляя особую осторожность в отношении вашего ускорения ( и поддержания вашего программного обеспечения в актуальном состоянии ).
Самое важное правило, которое следует иметь в виду: всегда избегайте выхода, никогда на входе. Вы можете безопасно кэшировать свой экранированный вывод, если вас беспокоит производительность, но всегда сохраняйте и управляйте данными без сохранения.
В порядке предпочтения:
{{ var|e('html_attr') }}
htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)
и убедитесь, что в остальной части вашего документа используется тот же набор символов, что и $charset
. В большинстве случаев 'UTF-8'
является желаемым набором символов. Попытка фильтровать XSS на входе – это преждевременная оптимизация , которая может привести к неожиданным уязвимостям в других местах.
Например, недавняя уязвимость WordPress XSS использовала усечение столбца MySQL, чтобы разорвать их стратегию экранирования и предотвратить несанкционированное сохранение преждевременно экранированной полезной нагрузки. Не повторяйте свою ошибку.