Alcune delle più interessanti novità introdotte nella versione 5 di PHP sono le cosiddette filter functions, cioè funzioni native del linguaggio che permettono di monitorare, validare e depurare i dati contenuti all'interno di variabili e argomenti.
Queste funzioni si rivelano uno strumento molto utile per il controllo di parametri di input, stringhe, array e altri costrutti e in molti casi costituiscono un'alternativa valida a complicate istruzioni basate sulle espressioni regolari.
Le filter functions al momento disponibili sono sette, tutte introdotte nella release 5 del linguaggio:
- filter_has_var(): controlla se esiste una variabile relativamente ad un determinato tipo di input (metodo);
- filter_id(): restituisce l'identificativo univoco ("ID") associato ad un determinato filtro;
- filter_input(): raccoglie un parametro di input proveniente per esempio da un form o da una querystring e si occupa di filtrarlo;
- filter_input_array(): raccoglie più parametri di input provenienti per esempio da un form o da una querystring e si occupa di filtrarli;
- filter_list(): restituisce un array contenente tutti i filtri supportati con relativo indice numerico;
- filter_var_array(): intercetta più variabili e le filtra;
- filter_var(): intercetta una varabile e la filtra.
In questa breve trattazione verranno descritte le caratteristiche di alcune di queste funzioni e le diverse modalità di utilizzo.
I filtri
Per svolgere il loro compito le funzioni precedentemente descritte hanno a disposizione dei filtri, questi ultimi possono essere visualizzati attraverso la funzione filter_list()
che restituisce un array contenente tutti i filtri utilizzabili; a questo proposito si analizzi il seguente esempio:
<?php
print_r(filter_list());
?>
Il risultato dell'esecuzione di queste tre semplici righe di listato sarà il seguente:
Array
(
[0] => int
[1] => boolean
[2] => float
[3] => validate_regexp
[4] => validate_url
[5] => validate_email
[6] => validate_ip
[7] => string
[8] => stripped
[9] => encoded
[10] => special_chars
[11] => unsafe_raw
[12] => email
[13] => url
[14] => number_int
[15] => number_float
[16] => magic_quotes
[17] => callback
)
Da notare come la funzione filter_list()
non sia in grado di restituire l'identificativo univoco dei filtri contenuti all'interno del relativo vettore, essa infatti si limita a mostrare il nome di ciascuno di essi e il numero indice (da 0 a n) che ne stabilisce la posizione all'interno dell'array.
Per ottenere l'ID di un determinato filtro, si dovrà utilizzare invece l'apposita funzione filter_id()
a cui passare il nome dello stesso quale argomento, ad esempio la seguente istruzione:
<?php
echo(filter_id("special_chars"));
?>
restituirà in output l'intero "515" che è appunto il valore dell'identificativo univoco associato al filtro denominato "special_chars" che ha come numero indice "10" nel vettore dei filtri utilizzabili.
Validare i dati con i filtri
I filtri elencati dalla lettura dell'array vengono utilizzati per due ambiti di applicazione:
- la validazione dei dati;
- la depurazione dei dati.
Per quanto riguarda la validazione, sono disponibili i seguenti filtri:
- FILTER_VALIDATE_INT: permette la validazione di un valore come numero intero anche considerando uno specifico intervallo numerico.
- FILTER_VALIDATE_BOOLEAN: si occupa della validazione dei valori booleani e restituisce TRUE per i valori "1", "true", "on" e "yes"; restituisce invece FALSE per i valori "0", "false", "off", "no" e "" (assenza di valore). Negli altri casi restituisce NULL.
- FILTER_VALIDATE_FLOAT: valida un valore come float (decimale);
- FILTER_VALIDATE_REGEXP: permette di validare un valore sulla base di un confronto con un'espressione regolare Perl-compatibile;
- FILTER_VALIDATE_URL: esegue il controllo di validazione su un valore come URL, sono disponibili argomenti opzionali a seconda della tipologia di URL che si desidera validare;
- FILTER_VALIDATE_EMAIL: consente di validare un valore come indirizzo di posta elettronica;
- FILTER_VALIDATE_IP: svolge la funzione di validare un valore come indirizzo IP, permette anche di specificare la versione di protocollo Internet tra IPv4 e IPv6.
Utilizzare i filtri per la validazione è estremamente semplice, si analizzi a questo proposito il seguente esempio:
<?php
// controllo sul formato di un indirizzo email
// con le filter functions
// definizione di un indirizzo email
$email = "info@megan fox.com";
// controllo tramite funzione e filtro per la validazione
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
{
// messaggio in caso di esito negativo
echo "Indirizzo email non valido.";
}else{
// messaggio in caso di esito positivo
echo "Indirizzo email valido.";
}
?>
Nel caso specifico, la procedura di validazione tramite filtro restituirà esito negativo in quanto l'indirizzo e-mail passato come argomento alla funzione filter_var()
contiene uno spazio che ne rende invalido il formato; il secondo argomento della funzione è costituito dal filtro FILTER_VALIDATE_EMAIL
che si occupa nativamente di controllare il formato dell'indirizzo e-mail senza il bisogno di introdurre espressioni regolari, cosa necessaria prima dell'introduzione di questo strumento.
Depurare i dati con i filtri
Per quanto riguarda il filtri messi a disposizione per le filter functions nelle operazioni di depurazione dei dati, essi sono i seguenti:
- FILTER_SANITIZE_STRING: rimuove i tags HTML eventualmente presenti in una stringa e, opzionalmente, permette di rimuovere o codificare caratteri speciali; FILTER_SANITIZE_STRIPPED: funge da "alias", collegamento con omologhe funzioni, per il filtro FILTER_SANITIZE_STRING;
- FILTER_SANITIZE_ENCODED: svolge la funzione di codificare le URL (sostituendo per esempio la doppia slash negli indirizzi con i corrispondenti code points esadecimali o caratteri riservati), opzionalmente permette anche di rimuovere o codificare i caratteri speciali;
- FILTER_SANITIZE_SPECIAL_CHARS: permette di effettuare l'escape dei caratteri "<>& e di quelli con valore ASCII inferiore a 32;
- FILTER_SANITIZE_EMAIL: consente di rimuovere da una determinata stringa tutti i caratteri non consentiti per un indirizzo di posta elettronica, permette invece di utilizzare tutte le lettere dell'alfabeto, simboli numerici e i caratteri !#$%&'*+-/=?^_`{|}~@.[]
- FILTER_SANITIZE_URL: si tratta di uno strumento utilizzabile per la rimozione da una determinata stringa di tutti i caratteri non consentiti per una URL, consente invece di utilizzare le lettere dell'alfabeto, i simboli numerici e i caratteri speciali $-_.+!*'(),{}|^~[]`<>#%";/?:@&=;
- FILTER_SANITIZE_NUMBER_INT: rimuove da una stringa tutti i caratteri eccetto I simboli numerici e i simboli aritmetici di addizione ("+") e sottrazione ("-");
- FILTER_SANITIZE_NUMBER_FLOAT: rimuove da una stringa tutti i caratteri eccetto i simboli numerici e i simboli aritmetici di addizione ("+") e sottrazione ("-") e opzionalmente i simboli ".", ",", "e" ed "E";
- FILTER_SANITIZE_MAGIC_QUOTES: applica la funzione addslashes() sulle stringhe, in questo modo sarà possibile introdurre il backslash davanti a caratteri predefiniti quali: apici singoli ('), doppi apici ("), backslash () e NULL.
Così come per i filtri destinati alla validazione, anche l'utilizzo dei parametri per la depurazione dei dati è molto semplice; a questo proposito si osservi il seguente esempio:
<?php
$nome = "<h1>Megan Fox<h1>";
var_dump(filter_var($nome, FILTER_SANITIZE_STRING));
?>
L'output dell'istruzione proposta sarà il seguente:
string(9) "Megan Fox"
Il filtro FILTER_SANITIZE_STRING
, utilizzato come secondo argomento per la funzione filter_var()
, permette infatti di rimuovere i il markup HTML restituendo una stringa depurata dai tags.
Validare e depurare assieme
Le funzioni per la validazione e quelle per la depurazione dei dati possono anche essere utilizzate in combinazione tra loro, come nella seguente funzione personalizzata:
<?php
// definizione di una funzione per la depurazione e
// la validazione di un indirizzo e-mail
function validaEmail($email){
// controllo tramite funzione e filtri per la depurazione e la validazione
return filter_var(filter_var($email, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
}
// test della funzione
if(validaEmail("email@miaemail.it")){
// messaggio in caso di esito positivo
echo "Indirizzo email valido.";
}else{
// messaggio in caso di esito negativo
echo "Indirizzo email non valido.";
}
?>
Nel caso proposto, il filtro FILTER_SANITIZE_EMAIL
si occuperà di depurare una stringa da tutti i caratteri non consentiti per un indirizzo di posta elettronica, dopodiché FILTER_VALIDATE_EMAIL
permetterà di stabilire se l'output ottenuto della precedente depurazione potrà essere considerato o meno un indirizzo e-mail in formato valido.
Oltre ai filtri già esposti per la validazione e la depurazione, sono disponibili anche i seguenti filtri da utilizzare come parametri per le filter functions:
- FILTER_CALLBACK: permette di effettuare una chiamata ad una funzione definita dall'utente per applicare un filtro sui dati;
- FILTER_UNSAFE_RAW: in pratica non svolge alcuna funzione, ma opzionalmente permette di rimuovere o codificare caratteri speciali.
Conclusioni
Le filter functions sono degli strumenti avanzati messi a disposizione da PHP 5 per la validazione e la depurazione di dati da contenuti non desiderati o non validi; nel corso di questa trattazione ne sono state analizzate le caratteristiche e gli ambiti d'utilizzo proponendo anche alcuni esempi pratici. Per approfondimenti si consiglia di consultare l'apposita sezione del manuale ufficiale di PHP.