Non inviare mai alcun dato di alcun tipo allo stream HTML che non ha passato attraverso htmlspecialchars()
e il gioco è fatto. Regola semplice, facile da seguire, sradica completamente qualsiasi rischio XSS.
Come programmatore è il tuo lavoro.
È possibile definire
function h(s) { return htmlspecialchars(s); }
se htmlspecialchars()
è troppo tempo per scrivere 100 volte al file PHP. D'altra parte, l'utilizzo di htmlentities()
non è affatto necessario.
Il punto chiave è: c'è il codice e ci sono dati. Se si mescolano i due, ne derivano cose cattive.
Nel caso dell'HTML, il codice è elementi, nomi di attributi, entità, commenti. I dati sono tutto il resto. I dati devono essere sfuggiti a per evitare di essere scambiati per il codice.
Nel caso di URL, il codice è lo schema, il nome host, il percorso, il meccanismo della stringa di query (?
, &
, =
, #
). I dati sono tutto nella stringa di query: nomi e valori dei parametri. Il valore deve essere evaso per evitare di essere scambiato per il codice con.
URL incorporati in HTML deve essere doppiamente sfuggiti (per URL-fuga e HTML-fuga) per garantire una corretta separazione del codice e dati.
I moderni browser sono in grado di analizzare il markup incredibilmente rotto e errato in qualcosa di utile. Questa capacità non dovrebbe essere sottolineata, però. Il fatto che qualcosa funzioni (come gli URL in <a href>
senza l'applicazione di escape HTML corretta) non significa che sia corretto o corretto farlo. XSS è un problema che affonda le radici in a) persone inconsapevoli della separazione di dati/codice (ad esempio "fuga") o di quelli che sono sciatti eb) persone che cercano di essere intelligenti su quale parte di dati non è necessario sfuggire.
XSS è abbastanza facile da evitare se ci si assicura di non rientrare nelle categorie a) eb).
Intendevi "_cross-site_ scripting" invece di "scripting lato server"? Oppure ti stavi riferendo al codice remoto i NCLUSIONE/esecuzione? – janmoesen
scusate, si lo faccio – Tim