Programmazione

Proteggersi dall’XSS

By 9 marzo 2016 2 Comments

La sicurezza nei siti web è sempre un argomento molto discusso, molte volte si prendono estreme precauzioni per garantirla (magari limitando le possibilità all’utente) e molte volte non ci si bada neanche (fidandosi del software di sviluppo utilizzato, ndA).

In entrambi i casi bisogna comprendere che la sicurezza (indipendentemente dal tipo di sito) è importante e necessita di un buono studio per bilanciare la navigazione utente e la sua/nostra sicurezza.

Così oggi vi parlerò di una semplice, ma efficace, tecnica contro il XSS (Cross-site scripting) utilizzando PHP.

Cos’è l’XSS?

Il cross-site scripting è una vulnerabilità sul controllo degli input form. Infatti se il testo inserito negli input non viene opportunamento controllato e filtrato si rischia di permettere l’accesso a informazioni sensibili, modifiche di contenuti o fastidioso spam. L’80% di tutte le violazioni sembrano essere di tipo XSS (secondo una ricerca di symantec del 2007), un dato sufficiente a chiederci se i nostri siti sono sicuri.

Anche se molti siti vengono sviluppati utilizzando CMS (che pongono comunque attenzione a queste problematiche filtrando tutti gli input) potete provare un attacco XSS semplicemente digitando qualcosa sul vostro input di ricerca, ad esempio (sostituite le parentesi con i simboli di apertura e chiusura tag):

<script type="text/javascript">alert("attacco xss")</script>

Se al click su cerca visualizzerete il messaggio “Attacco XSS” dovrete preoccuparvi più seriamente.

Come proteggersi utilizzando PHP?

Essendo le richieste via form delle richieste http per il server, siano esse GET o POST, PHP può venire in nostro aiuto con delle speciali funzioni semplici da usare.

Le principali funzioni sono 4: htmlspecialchars(), htmlentities(), strip_tags() e filter_var(). La differenza è sul loro output, nonchè sulla loro personalizzazione (filter_var soprattutto).

Esempio Pratico

Supponiamo di avere una pagina form.php con all’interno un paio di semplici input text (per nome, cognome, email ecc), al click su invia mandiamo le informazioni alla pagina sendmail.php che riceverà tutti i dati (GET o POST a seconda del method form inserito) per poi mandare una email.

Di norma avremmo qualcosa simile a:

$nome = $_GET['nome'];

In questo modo abbiamo preso il nome inserito dall’utente nel precedente form e inserito in una variabile chiamata nome (ho utilizzato il GET, era indifferente utilizzare il POST). Così facendo non c’è alcun controllo sul testo inserito, rischiando quindi di non gestire un codice javascript non voluto.

La soluzione è:

$nome = htmlentities($_GET['nome']);
$nome = strip_tags($_GET['nome']);

Htmlentities modificherà tutti i simboli dei tag tipo in entità…quindi < e >. Mentre strip_tags permette al sistema di trattare i vari tag html o script come semplice testo, quindi innocui.

Contromisure

Per prevenire XSS, l’applicazione web deve essere sviluppata seguendo alcune regole:

  • Evitare di ammettere in input caratteri speciali come: “”, “(”, “)”, “&”, “#”, “%”.
  • Codificare l’output in HTML, così da rendere inoffensivi anche i caratteri speciali.
  • Limitare la lunghezza delle stringhe in input ammesse all’utente.

Già così facendo si eliminano molti problemi, ulteriori attenzioni si possono dare alle funzioni di callback ecc ecc ma sono al di fuori da questa semplice guida.

Alcune informazioni utili:

Sanitize Filter PHP

strip_tags

htmlentities

filter_var

Per qualsiasi problema o richiesta scrivete un commento o un email al mio indirizzo.

Andrea Vigato

Author Andrea Vigato

freelance | creazione siti web | consulenza aziendale

More posts by Andrea Vigato