htmlspecialchars, htmlentities, strip_tags: Alcune funzioni PHP da utilizzare per difendersi dal Cross Site Scripting – XSS.

Obiettivo del tutorial: Mostrare l’importanza dell’utilizzo delle funzioni htmlspecialchars , htmlentities e strip_tags per scrivere codice non vulnerabile con attacchi di cross site scripting.

Nel tutorial PHP seguente vedremo quanto sia importante, quando si scrivono script che elaborano input dell’utente, convertire le stringhe di input inserite dall’utente in html.

Se si tralascia questo passaggio si è potenzialmente esposti al codice dannoso che l’utente potrebbe inserire attraverso la casella di input.

Guardate l’esempio seguente:

<?php
// Supponiamo che l'utente inserisca l'input
// contenuto nella seguente variabile.
  $input = '<script type="text/javascript">
alert("Attenzione input non controllato");
 </script>';

// se l'input non viene gestito correttamente 
// l'utente potrà eseguire codice arbitrario 
// da quella casella di input.
  echo htmlspecialchars($input) . '<br>';
  echo htmlentities($input);
// Le due funzioni sopra stampano l'input 
// dell'utente convertendolo prima in html.
// Quindi nessun codice dannoso inserito 
// dall'utente sarà eseguito.
  echo $input;
// Se non faccio nessun controllo il codice 
// sarà esposto ad attacchi XSS.

?>

Notate che filtrando l’input con htmlspecialchars e htmlentities lo script si difende dagli attacchi di Cross Site Scripting. Se invece non si controlla l’input l’utente può fare in modo che lo script esegua del suo codice (dell’utente).

Come funzionano htmlspecialchars e htmlentities ?

htmlspecialchars() htmlspecialchars()

Questa funzione converte l’argomento in codice html. Ad esempio i caratteri “<” e “>” vengono convertiti in “<” e “>”.

htmlentities() htmlentities()

Questa funzione funziona sostanzialmente come la precedente, ma con qualche variante. htmlentities usa le HTML entities per le conversioni di caratteri

per eliminare i caratteri html c’è un’altra interessante funzione:

strip_tags()

strip_tags() elimina i tag HML dalle stringhe che gli vengono passate come parametri.

<?php

  $input = 'caratteri in <b>Grassetto</b> 
      <script type="text/javascript">
alert("Attenzione input non controllato");
 </script>';

// Elimina i tag html
  echo strip_tags($input);
// Elimina i tag html lasciando
// quelli passati come parametro.
  echo strip_tags($input, '<b>');

?>

In conclusione: In PHP è importanssimo controllare qualsiasi cosa l’utente inserisce nelle caselle di input.