Il Cross-site scripting (XSS) è una vulnerabilità che colpisce tutti quei siti web dinamici che non eseguono sufficienti controlli nei campi di testo dei form.
Tramite textarea o input dei form è possibile inviare del testo ma anche dei tag html che verranno trasmessi, memorizzati in un db e, successivamente, visualizzati di nuovo in un’altra pagina. Ecco il pericolo degli XSS: Senza controllo si potrebbe buttare all’aria il layout del sito semplicemente inserendo un div senza chiuderlo.
Ma un XSS può essere anche più pericoloso: iniezione di codice Javascript, lettura dei Cookie e trasmissione ad un altro dominio, lettura di informazioni di sessione…
Ma come possiamo difenderci da attacchi XSS con PHP?
Il metodo più sicuro per uno sviluppatore PHP è quello di usare una delle tre funzioni che permettono l’escape dei caratteri html ricevuti da GET o POST:
- htmlspecialchars()
- htmlentities()
- strip_tags
Queste tre funzioni sono uguali e si differenziano solo per l’output:
htmlspecialchars
echo htmlspecialchars("<a href='link'>Testo Link</a>", ENT_QUOTES);
//output : <a href='link'>Testo Link</a> dato che converte i caratteri "particolari", in codice html
htmlentities
echo htmlentities("A 'quote' is <b>bold</b>");
//output: A 'quote' is <b>bold</b>
strip_tags
echo strip_tags('<p>Testo strip tag</p><!-- commento --> <a href="#link">link</a>'); //output: Testo strip tag link
Abbiamo visto che le pagine web che hanno dei form possono essere oggetto di attacchi XSS, ma, fortunatamente, PHP ci offre una vasta gamma di funzioni per difenderci da questa piaga.
Le funzioni strip_tags()
,htmlentities()
, htmlspecialchars()
aiutano a prevenire questi attacchi ma non rappresentano tuttavia la soluzione definitiva; la libreria HTML Purifier potrebbe essere un ulteriore passo in avanti dal punto di vista della sicurezza degli script.
Concludendo, dobbiamo cercare di non utilizzare negli script direttamente le variabili $_GET, $_POST o $_REQUEST
senza un minimo di controllo e pulizia per prevenire e anticipare un attacco cross site scripting.