Никогда не выводите какой-либо бит данных в поток HTML, который не прошел через htmlspecialchars()
, и все готово. Простое правило, которому легко следовать, полностью устраняет любой риск XSS.
Как программист, это ваша работа, хотя делать это.
Вы можете определить
function h(s) { return htmlspecialchars(s); }
, если htmlspecialchars()
слишком длинная, чтобы писать 100 раз на файл PHP. С другой стороны, использование htmlentities()
вовсе не обязательно.
Ключевой момент: есть код, и есть данные. Если вы смешаете эти два, произойдут плохие вещи.
В случае HTML код - это элементы, имена атрибутов, сущности, комментарии. Данные это все остальное. Данные необходимо экранировать, чтобы их не приняли за код.
В случае URL-адресов кодом является схема, имя хоста, путь, механизм строки запроса (?
, &
, =
, #
). Данные - это все в строке запроса: имена параметров и значения. Они должны быть экранированными, чтобы их не приняли за код.
URL-адреса, встроенные в HTML , должны * дублироваться (путем экранирования URL и экранирования HTML), чтобы обеспечить правильное разделение кода и данных.
Современные браузеры способны разбирать удивительно сломанную и некорректную разметку во что-то полезное. Эта возможность не должна быть подчеркнута, хотя. Тот факт, что что-то работает (например, URL в <a href>
без применения надлежащего экранирования HTML), не означает, что это правильно или правильно делать. XSS - это проблема, которая коренится в том, что а) люди не знают о разделении данных / кода (т. Е. «Избегают») или неаккуратны и б) люди, которые пытаются быть умными в отношении того, какую часть данных им не нужно избегать.
XSS достаточно просто избежать, если вы убедитесь, что не попадаете в категории a) и b).