Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP 5: le filter functions

Come monitorare, validare e depurare i dati contenuti all'interno di variabili e argomenti in PHP 5
Come monitorare, validare e depurare i dati contenuti all'interno di variabili e argomenti in PHP 5
Link copiato negli appunti

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:

  1. filter_has_var(): controlla se esiste una variabile relativamente ad un determinato tipo di input (metodo);
  2. filter_id(): restituisce l'identificativo univoco ("ID") associato ad un determinato filtro;
  3. filter_input(): raccoglie un parametro di input proveniente per esempio da un form o da una querystring e si occupa di filtrarlo;
  4. filter_input_array(): raccoglie più parametri di input provenienti per esempio da un form o da una querystring e si occupa di filtrarli;
  5. filter_list(): restituisce un array contenente tutti i filtri supportati con relativo indice numerico;
  6. filter_var_array(): intercetta più variabili e le filtra;
  7. 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:

  1. la validazione dei dati;
  2. 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.


Ti consigliamo anche