Il Cross-Site Scripting (XSS) è l’attacco più comune sul web. Fortunatamente esiste un metodo semplice ed efficace per prevenire che i dati inviati con un modulo vengano compromessi. Vediamo insieme quale procedura eseguire per sanitizzare i dati inviati tramite un form inserito su un sito web.
Esempio di modulo vulnerabile
Analizziamo il seguente modulo:
<form action="modulo.php" method="post"> <textarea name="commento"></textarea> <input type="submit" value="Invia"> </form>
I dati inseriti nel campo che abbiamo chiamato “commento” vengono inviati alla pagina modulo.php con il seguente codice PHP:
echo $_POST['commento'];
Una situazione di questo tipo espone il sito ad un attacco da parte di utenti malintenzionati; Il dato inviato, infatti, non viene filtrato e l’output non è in alcun modo gestito. Se un utente invia il seguente JavaScript:
<script>alert('Questa pagina è sotto attacco');</script>
quando il commento viene pubblicato e mostrato sulla pagina, i visitatori che approderanno successivamente su quella pagina vedranno comparire una finestra popup con su scritto “Questa pagina è sotto attacco”.
Come sanitizzare i dati provenienti da un modulo
Per evitare di incorrere in un problema di questo tipo occorre filtrare e validare tutti i dati che vengono inviati tramite form. Il modo più semplice è il seguente:
$filtra_commento = strip_tags($_POST['commento']);
Con la funzione PHP strip_tags() è possibile “ripulire” (sanitizzare) i dati dei moduli rimuovendo eventuali tag HTML e PHP inseriti. Nell’esempio precedente i tag <script> e </script> vengono esclusi dal commento evitando che lo script possa essere eseguito.
Prima di pubblicare i dati di un form è importante rimuovere (escape) caratteri potenzialmente pericolosi in questo modo:
$filtra_commento = htmlentities($filtra_commento, ENT_QUOTES, 'UTF-8');
In questo caso, la funzione PHP htmlentities() converte tutti i caratteri in entità HTML. Questo significa che le virgolette alte singole (‘) vengono convertite in entità HTML evitando l’esecuzione del codice inserito.