Nigdy nie wysyłaj żadnych danych do strumienia HTML, które nie zostały przekazane przez htmlspecialchars()
i jesteś skończony. Prosta zasada, łatwa do przestrzegania, całkowicie eliminuje ryzyko XSS.
Jako programista jest Twoja zadanie, aby to zrobić.
Możesz zdefiniować
funkcjafunction h(s) { return htmlspecialchars(s); }
if htmlspecialchars()
jest za długi, aby zapisać 100 razy na plik PHP. Z drugiej strony, używając htmlentities()
wcale nie jest konieczne.
Kluczową kwestią jest to, że jest kod i są dane. Jeśli połączysz te dwie rzeczy, wynikną złe rzeczy.
W przypadku HTML kod to elementy, nazwy atrybutów, encje, komentarze. Dane to wszystko inne. Dane muszą zostać ominięty, aby uniknąć pomylenia z kodem.
W przypadku adresów URL kodem jest schemat, nazwa hosta, ścieżka, mechanizm ciągu zapytania (?
, &
, =
, #
). Dane to wszystko w ciągu zapytania:nazwy parametrów i wartości. muszą zostać ominięty, aby uniknąć pomylenia z kodem.
Adresy URL osadzone w kodzie HTML muszą być podwójnie uciekinierami (poprzez zmianę znaczenia adresu URL i HTML-escaping), aby zapewnić prawidłowe oddzielenie kodu i danych.
Nowoczesne przeglądarki potrafią analizować zdumiewająco zepsute i niepoprawne znaczniki w coś użytecznego. Nie należy jednak podkreślać tej zdolności. Fakt, że coś się dzieje (np. adresy URL w <a href>
bez odpowiedniego zastosowania kodu HTML) nie oznacza, że jest to dobre lub poprawne. XSS to problem, który ma swoje źródło w a) ludziach nieświadomych separacji danych/kodu (tj. „uciekających”) lub tych, którzy są niechlujni oraz b) ludziach, którzy starają się sprytnie określić, której części danych nie muszą uciekać.
XSS jest dość łatwe do uniknięcia, jeśli upewnisz się, że nie należysz do kategorii a) i b).