Filtri PHP avanzati: una guida completa
Scopri i filtri PHP avanzati: flag, callback, filtraggio batch, valori predefiniti e le insidie più comuni nella validazione e sanitizzazione.
Filtrare l'input è una delle pratiche di sicurezza più importanti in PHP: ogni valore che arriva dall'esterno del codice — campi di un modulo, stringhe di query, cookie, payload API — deve essere trattato come non attendibile finché non è stato validato o pulito. PHP include un'estensione filter integrata che fa esattamente questo, quindi raramente è necessario scrivere espressioni regolari a mano per i controlli più comuni. Questo capitolo va oltre le basi e tratta i flag dei filtri, le callback, il filtraggio in batch, i valori predefiniti e le insidie che si incontrano in produzione.
Se non conosci ancora l'estensione filter, inizia con il capitolo introduttivo PHP Filters, poi torna qui.
Comprendere i filtri PHP
Un filtro è una regola denominata che PHP applica a un valore tramite la funzione filter_var() (e le sue varianti). Un filtro può svolgere due compiti:
- Validare — verificare se un valore corrisponde già a un formato e restituire il valore in caso di successo o
falsein caso di fallimento. Il valore non viene modificato. - Sanitizzare — trasformare un valore eliminando o codificando i caratteri indesiderati e restituire la stringa ripulita.
Sapere quale compito è necessario è fondamentale: la validazione rifiuta i dati errati, la sanitizzazione li riscrive. Per i moduli rivolti agli utenti di solito si valida prima (rifiuto) e si sanitizza solo quando è necessario accettare e pulire un valore (ad esempio, eseguire l'escape dell'HTML prima della visualizzazione).
Tipi di filtri
PHP fornisce diversi tipi di filtri utilizzabili per scopi differenti. Alcuni dei più comunemente usati includono:
- Filtri di validazione: questi filtri vengono usati per validare i dati, ad esempio verificare se una stringa è un indirizzo email valido o se un numero rientra in un determinato intervallo.
- Filtri di sanitizzazione: questi filtri vengono usati per sanitizzare i dati, ad esempio rimuovere caratteri dannosi da una stringa o convertire caratteri speciali in entità HTML.
- Filtri personalizzati: questi filtri consentono di definire funzioni di filtro personalizzate per esigenze specifiche.
Un numero limitato di filtri copre la grande maggioranza dei casi d'uso reali:
| Filtro | Compito | Esempio d'uso |
|---|---|---|
FILTER_VALIDATE_EMAIL | Validare | Verificare un indirizzo email |
FILTER_VALIDATE_INT | Validare | Verificare un intero, opzionalmente entro un intervallo |
FILTER_VALIDATE_FLOAT | Validare | Verificare un numero in virgola mobile |
FILTER_VALIDATE_URL | Validare | Verificare un URL |
FILTER_VALIDATE_IP | Validare | Verificare un indirizzo IPv4/IPv6 |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Sanitizzare | Codificare i caratteri speciali HTML |
FILTER_SANITIZE_NUMBER_INT | Sanitizzare | Eliminare tutto tranne le cifre e +/- |
FILTER_SANITIZE_EMAIL | Sanitizzare | Rimuovere i caratteri non consentiti in un'email |
Puoi elencare tutti i filtri supportati dalla tua build con filter_list().
Usare i filtri PHP
La sintassi di base per applicare un filtro è:
Sintassi della funzione PHP filter_var
filter_var($variable, $filter, $options);Dove $variable è il valore da filtrare, $filter è una costante di filtro come FILTER_VALIDATE_EMAIL, e l'argomento opzionale $options accetta flag o opzioni specifiche del filtro.
filter_var($variable, FILTER_VALIDATE_EMAIL);In questo caso filter_var() verifica se il valore memorizzato in $variable è un indirizzo email valido, restituendo l'email in caso di successo o false in caso di fallimento.
Esistono anche funzioni dedicate per leggere direttamente l'input esterno — filter_input() per un singolo valore e filter_input_array() per molti — che leggono da INPUT_GET, INPUT_POST, INPUT_COOKIE e così via. Usale al posto di accedere direttamente a $_GET/$_POST, perché leggono dai dati della richiesta originale anche se una superglobale è stata modificata.
Opzioni avanzate dei filtri PHP
I filtri PHP offrono anche diverse opzioni avanzate per personalizzarne il comportamento. Alcune delle più comunemente usate includono:
- Opzioni flag: queste opzioni modificano il comportamento del filtro, ad esempio richiedendo un tipo di dato specifico o consentendo valori multipli. Per esempio,
FILTER_FLAG_EMAIL_UNICODEpermette caratteri internazionali nella validazione delle email. - Funzioni callback: consentono di passare una funzione personalizzata a
FILTER_CALLBACKper logiche di validazione o sanitizzazione su misura. - Filtraggio di array: usa
filter_var_array()ofilter_input_array()per applicare filtri a più variabili contemporaneamente, il che è particolarmente utile per elaborare dati di moduli o stringhe di query.
Esempi di filtri PHP
Ecco alcuni esempi di come i filtri PHP possono essere usati in situazioni reali:
PHP — validazione di un'email con filter_var
In questo esempio, la funzione filter_var viene usata per validare un indirizzo email. Se l'indirizzo email è valido, lo script restituirà "Email is valid", altrimenti restituirà "Email is not valid".
PHP — sanitizzazione di una stringa con filter_var
In questo esempio, la funzione filter_var viene usata per sanitizzare una stringa. Il filtro FILTER_SANITIZE_FULL_SPECIAL_CHARS viene usato per rimuovere o codificare i tag HTML e i caratteri speciali dalla stringa, producendo una stringa sicura e pulita utilizzabile nell'applicazione.
Esempi avanzati di filtri PHP
Per sfruttare al massimo la potenza dei filtri PHP, puoi usare callback e filtraggio di array:
PHP — filtro con callback
<?php
function custom_sanitize($str) {
return strtoupper(trim($str));
}
$input = " hello world ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);
echo $result; // Outputs: HELLO WORLD
?>PHP — filtraggio di un array di variabili
<?php
$data = [
"email" => "[email protected]",
"age" => "25",
"url" => "https://example.com"
];
$filters = [
"email" => FILTER_VALIDATE_EMAIL,
"age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
"url" => FILTER_VALIDATE_URL
];
$result = filter_var_array($data, $filters);
print_r($result);
?>L'output è:
Array
(
[email] => [email protected]
[age] => 25
[url] => https://example.com
)Se un valore non supera il proprio filtro, la chiave corrispondente conterrà false invece del valore, così è possibile identificare esattamente quale campo non era valido.
Validare un intero entro un intervallo
Le opzioni min_range e max_range fanno sì che FILTER_VALIDATE_INT rifiuti i numeri fuori dall'intervallo — utile per cose come una quantità o un'età:
<?php
$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>Poiché 150 è superiore a max_range, il filtro restituisce false anche se "150" è una stringa di intero perfettamente valida.
Fornire un valore predefinito quando la validazione fallisce
La maggior parte dei filtri di validazione accetta un'opzione default, così puoi tornare a un valore sicuro invece di false:
<?php
$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
"options" => ["default" => 0.0]
]);
var_dump($price); // float(0)
?>Insidie comuni
Alcuni comportamenti sorprendono i principianti:
falseè un valore valido. Quando un valore è legittimamente0o"0", un controllo ingenuoif (filter_var(...))lo tratta come fallimento. Confronta esplicitamente confalseusando l'operatore stretto:if (filter_var($n, FILTER_VALIDATE_INT) === false).- La validazione non modifica il valore.
FILTER_VALIDATE_*restituisce il valore originale (con cast dove appropriato) ofalse; non esegue mai la sanitizzazione. Se hai bisogno di una stringa pulita, usa un filtroFILTER_SANITIZE_*. - La validazione dell'email non è una verifica della consegna.
FILTER_VALIDATE_EMAILcontrolla solo la sintassi — non può confermare che la casella di posta esista. AggiungiFILTER_FLAG_EMAIL_UNICODEse accetti indirizzi internazionalizzati. - La sanitizzazione non equivale all'escape per SQL. Usa le prepared statement (o
mysqli_real_escape_string()) per le query al database; i filtri servono per la pulizia del formato, non per la sicurezza delle query.
Conclusione
In conclusione, i filtri PHP sono uno strumento essenziale per gli sviluppatori web che desiderano validare e sanitizzare i dati di input. Con i vari tipi e le opzioni disponibili, puoi facilmente adattare i filtri alle esigenze specifiche della tua applicazione. Che tu voglia validare email, rimuovere caratteri dannosi o eseguire validazioni personalizzate, i filtri PHP ti coprono.
Non dimenticare di combinare i filtri con altre misure di sicurezza — prepared statement, escape dell'output e protezione CSRF — per mantenere la tua applicazione web il più sicura possibile. Per una guida completa, consulta PHP Form Validation.