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