Come ripulire gli input dell’utente? Una guida pratica per aumentare la sicurezza dei nostri siti sanitizzando le variabili prima di usarle nel codice

<span class="entry-title-primary">Come ripulire gli input dell’utente?</span> <span class="entry-subtitle">Una guida pratica per aumentare la sicurezza dei nostri siti sanitizzando le variabili prima di usarle nel codice</span>

In questo tutorial vedremo le più comuni pratiche di programmazione per rendere più sicuri i nostri siti ed applicazioni PHP.

Sanitizzare è un termine poco familiare ai più, eppure viene spesso associato ad una pratica di sicurezza informatica, da attuarsi in fase di programmazione, decisamente trascurata. Si tratta di verificare mediante opportuni check lato codice che l’input inserito dall’utente di internet, specialmente se anonimo, sia idoneo ad essere dato in pasto al codice dell’applicazione web.

sanitizzante, anche come agg. e s. m., detto di quelle sostanze ad azione battericida che riducono il numero di batterî o di virus, spec. in ambienti e macchinarî destinati alla lavorazione di prodotti alimentari.

(treccani.it)

L’argomento è tanto vasto quanto complesso, e questo articolo cercherà di coprire gli aspetti più essenziali: la prima cosa che possiamo dire è che l’approccio di base alla programmazione è molto importante. In particolare, si tratta di fare in modo di garantire che il codice che andremo ad eseguire sia coerente con la configurazione del server, e che soprattutto non ci siano:

  • servizi inutilizzati in esecuzione;
  • operazioni inutili all’interno del codice.

Solo in questo modo si potrà mantenere il codice snello e manutenibile nel tempo, con ovvi vantaggi in termini di sicurezza.

Se ad esempio il dato in ingresso viene acquisito mediante una variabile:

$x = $_POST['abc']

oppure

$x = $_GET['abc']

è indispensabile verificare la natura dell’input. In altri termini, mediante espressioni regolari (REGEX) potremo fare in modo di assicurarci che quell’input sia effettivamente quello che ci aspettiamo e non, ad esempio, un frammento di codice malevolo (XSS) o un tentativo di SQL poisoning.

Ad esempio se $x deve essere una mail, potremmo premettere a qualsiasi altra istruzione:

if ( preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/',$x) ) {
//istruzioni specifiche
//[...]
}
else {
//tratta l'abuso, o ignoralo
//[...
}

L’esempio non è la migliore regex al mondo per validare una mail, ma rende l’idea di due cose molto importanti:

  1. le validazioni degli input vanno eseguite in modo specifico caso per caso, e richiedono spesso uno sforzo concettuale notevole;
  2. non esiste una regex assolutamente adatta a filtrare qualsiasi input, dipende sempre dal contesto.

Altra cosa importante, una sanitarizzazione / validazione robusta degli input va eseguita sempre lato server, in quando via Javascript è necessaria per facilitare la vita all’utente ma, al tempo stesso, è facilmente aggirabile da un attaccante.

Premesso ciò, un possibile approccio permette di suddividere la sanitarizzazione dell’input utente – ad esempio, una casella di ricerca nel sito ($_POST) oppure un parametro URL ($_GET) in questo modo:

  1. le richieste via GET si possono trattare basilarmente mediante urlencode.
  2. il filtro di codice HTML/via GET avviene mediante htmlentities.
  3. per evitare l’uso improprio dei comandi della shell via remoto, sfruttare escapeshellcmd;
  4. per passare/limitare gli argomenti via shell: use escapeshellargs.
  5. per filtrare un parametro in una query MySQL sfruttare mysql_real_escape_string.
  6. in molte situazioni è opportuno validare l’input ragionando sulla sua forma tipica ed inserendo dei blocchi “if” che ne testino lunghezza, struttura e via dicendo (REGEX)

Esempi pratici d’uso:

echo '';
$href = htmlEntities($_GET['abc'], ENT_QUOTES);
$escaped_command = escapeshellcmd($command);
system('ls '.escapeshellarg($dir));
$myinput = mysql_real_escape_string($myinput);

Photo by Zayabibu

Ti piace questo articolo?

0 voti

Su Trovalost.it puntiamo sulla qualità dei contenuti da quando siamo nati: la tua sincera valutazione può aiutarci a migliorare ogni giorno.

Ti potrebbero interessare (Guide per webmaster):

Cerca altro nel sito

Clicca sul box, e scegli la sezione per vederne i contenuti.