Controllo dei dati provenienti dai form


Introduzione
Quando si programmano applicazioni per il Web capita spesso di dover interagire con gli utenti. Per farlo si usano i form: maschere dove si possono inserire testi per soddisfare le esigenze di interattività del sito. Si pensi ai forum, alle bacheche elettroniche, ai form mail, ecc.: in questi casi occorre trattare e filtrare opportunamente il testo inserito dall'utente prima di poterlo utilizzare nel programma. Se non lo si fa, si rischia di andare incontro a seri problemi di funzionamento e sicurezza dell'applicazione. Ad esempio, se si chiede di inserire una data, una mail, un dato di tipo numerico, prima di prendere per buono ciò che l'utente inserisce occorre fare dei controlli per verificare che ciò che è stato inserito corrisponda al tipo di dato che ci aspettiamo e stia dentro il campo di valori prefissato. Occorre inoltre fare anche dei controlli sui dati inseriti: la verifica che i dati non contengano elementi pericolosi per l'applicazione. Vediamo quali sono le funzioni che PHP mette a disposizione per facilitarci in questo compito.
I primi controlli
Supponiamo di avere nella variabile $messaggio il dato inserito da un utente in un modulo o in un form e che vogliamo memorizzarlo in una pagina Web del nostro sito in modo da renderlo visibile a tutti i visitatori oppure vogliamo usarlo per farci un’ulteriore elaborazione e presentare un risultato. Per prima cosa si deve controllare che la variabile $messaggio non sia vuota, ma contenga qualcosa. Per fare questo possiamo usare la funzione PHP empy() in questo modo:
 
1.If (!empty($messaggio)) { continua nel controllo }
2.else { print $errore; } // Se $messaggio non è vuoto, continua nel controllo altrimenti visualizza un errore.
Un’ulteriore verifica sarebbe bene farla anche sulla dimensione della variabile al fine di evitare che un testo troppo lungo occupi troppo spazio rallentando il caricamento della pagina.
Per fare ciò possiamo usare la funzione PHP strlen():
1.if ( strlen ( $messaggio ) < $dimensione_massima ) { continua nel controllo }
Un controllo, in certi casi, è bene farlo anche sul tipo di dato. Se, per esempio, ci aspettiamo un dato numerico per fare un certo calcolo, dobbiamo controllare che effettivamente ci arrivi un numero. Per fare questo possiamo usare la funzione PHP (v.4) is_numeric() (eventualmente insieme ad altre funzioni simili, come is_integer(), is_real(), is_string() is_bool(), ecc. per altri tipi di dati) in questo modo:
 
1.If (is_numeric($messaggio)) { continua nel controllo }
Ma non basta. Nel caso di input numerici occorre controllare anche il "range" di validità del numero per evitare numeri troppo grossi o troppo piccoli che potrebbero fare andare in overflow il programma. Quindi attenzione agli zeri! Una divisione per zero genera un errore.
Alcune precauzioni
Molto importante, a mio avviso, è filtrare il contenuto di $messaggio in modo da impedire che TAG HTML (inseriti involontariamente o maliziosamente) possano finire nella nostra pagina modificandone la formattazione. Si pensi a cosa accadrebbe se una persona inserisse maliziosamente nella maschera del nostro forum il seguente testo:
 
1.<img src=/img/guide/53/immagine.jpg>
Il file immagine.jpg verrebbe caricato dal sito Altrosito.com e l'immagine visualizzata sulla pagina del nostro sito. Oppure si pensi se si inserisse un testo del tipo:
 
1.<?php (istruzioni php) ?>
Per evitare queste situazioni potenzialmente pericolose PHP mette a disposizione due funzioni: HtmlSpecialChar() e HtmlEntities().
HTMLSpecialChar() trasforma tutti i caratteri < > & " (doppi apici) rispettivamente nell'equivalente simbolico html: < > & " In questo modo si dà il corretto significato ai caratteri "<" , ">" e si impedisce che il browser li interpreti come tag html.
Occorre quindi inserire nel programma di controllo un'istruzione:
 
1.$messaggio = HTMLSpecialChar($messaggio);
per filtrare il contenuto della variabile $messaggio ed eliminare i tag html.
Si può anche usare la funzione HTMLEntities() nello stesso modo:
 
1.$messaggio = htmlentities($messaggio);
La differenza è che HtmlEntities() trasforma nell'equivalente simbolico html un più ampio spettro di caratteri, come ad esempio le lettere accentate à è ì ò ù, che diventano à è ì ò eccetera.
Esiste una terza funzione: Strip_Tags(), che, invece, elimina tutto il contenuto della variabile compreso tra i caratteri < e >. Quale di queste funzioni usare dipende dai vari casi e da cosa si vuole fare ed è compito del programmatore scegliere quella che più si adatta alle proprie esigenze.

Argomenti correlati

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)