Come ripulire gli input dell’utente in un form

Aggiornato il: 27-06-2022 06:00
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.

SMSHosting Usa il codice PROMO per uno sconto sul primo acquisto: PRT96919

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



Questo blog pubblica contenuti ed offre servizi free da 11 anni. – Leggi un altro articolo a caso – Per informazioni contattaci
Non ha ancora votato nessuno.

Ti piace questo articolo? Vota e fammelo sapere.

Come ripulire gli input dell’utente in un form
L'hosting italiano conveniente e funzionale è V-Hosting !
2788876181 e49c8dcb6b clean
Torna su