Mata aldrig ut någon som helst bit av data till HTML-strömmen som inte har skickats genom htmlspecialchars()
och du är klar. Enkel regel, lätt att följa, eliminerar helt alla XSS-risker.
Som programmerare är det din jobb att göra det, dock.
Du kan definiera
function h(s) { return htmlspecialchars(s); }
if htmlspecialchars()
är för lång för att skriva 100 gånger per PHP-fil. Å andra sidan använder du htmlentities()
är inte alls nödvändigt.
Nyckelpunkten är:Det finns kod och det finns data. Om du blandar de två, uppstår dåliga saker.
När det gäller HTML är kod element, attributnamn, enheter, kommentarer. Data är allt annat. Data måste escaped för att undvika att misstas för kod.
När det gäller URL:er är koden schemat, värdnamnet, sökvägen, mekanismen för frågesträngen (?
, &
, =
, #
). Data är allt i frågesträngen:parameternamn och -värden. De måste escaped för att undvika att misstas för kod.
Webbadresser som är inbäddade i HTML måste vara dubbelt escaped (genom URL-escaped och HTML-escape) för att säkerställa korrekt separation av kod och data.
Moderna webbläsare kan analysera otroligt trasig och felaktig uppmärkning till något användbart. Denna förmåga bör dock inte betonas. Det faktum att något råkar fungera (som webbadresser i <a href>
). utan korrekt HTML-escape) betyder inte att det är bra eller korrekt att göra det. XSS är ett problem som har sina rötter i a) personer som inte är medvetna om data-/kodseparation (d.v.s. "flykter") eller de som är slarviga och b) personer som försöker vara smarta med vilken del av data de inte behöver för att fly.
XSS är lätt nog att undvika om du ser till att du inte hamnar i kategorierna a) och b).