PHP Filter
Scopri l'estensione filter di PHP: validazione e sanitizzazione, filter_var(), filter_input(), costanti FILTER_VALIDATE_* e FILTER_SANITIZE_*, e flag.
L'estensione filter di PHP è lo strumento integrato per verificare e pulire i dati che provengono dall'esterno dello script — campi di form, query string, cookie e header HTTP. Poiché questi dati sono controllati dall'utente (e a volte da un attaccante), non dovresti mai fidarti di essi direttamente. Questa pagina spiega la differenza tra validazione e sanitizzazione, le funzioni principali (filter_var() e filter_input()), le costanti dei filtri più utilizzate e le insidie più comuni.
Validazione vs. sanitizzazione
L'estensione filter svolge due compiti distinti, e confonderli è l'errore più comune:
- Validazione — verifica se un valore corrisponde a una regola e restituisce il valore se corrisponde, oppure
falsein caso contrario. Non modifica mai il valore. Usa i filtriFILTER_VALIDATE_*. - Sanitizzazione — rimuove o codifica i caratteri non consentiti e restituisce la stringa ripulita. Non indica mai se l'input era "corretto". Usa i filtri
FILTER_SANITIZE_*.
Regola pratica: valida per decidere se accettare l'input, sanitizza per renderlo sicuro da usare. Non sono intercambiabili — un'email sanitizzata non garantisce che l'email sia ben formata.
filter_var() — filtrare una singola variabile
filter_var() è la funzione principale. Accetta un valore, una costante filtro e opzioni facoltative:
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixedValidazione
<?php
$email = "[email protected]";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email is valid\n";
} else {
echo "Email is invalid\n";
}
// Numbers, URLs and IPs work the same way:
var_dump(filter_var("42", FILTER_VALIDATE_INT)); // int(42)
var_dump(filter_var("not-a-number", FILTER_VALIDATE_INT)); // bool(false)
var_dump(filter_var("https://w3docs.com", FILTER_VALIDATE_URL)); // stringOutput:
Email is valid
int(42)
bool(false)
string(18) "https://w3docs.com"Attenzione: i filtri di validazione restituiscono
falsein caso di fallimento, ma0e""sono anch'essi falsy.filter_var("0", FILTER_VALIDATE_INT)restituisceint(0), che fallisce un sempliceif. Confronta con=== false, oppure passaFILTER_NULL_ON_FAILUREin modo che i fallimenti diventinonulle tu possa usare!== null.
Sanitizzazione
<?php
$dirty = " john (doe)@exa<>mple.com ";
echo filter_var($dirty, FILTER_SANITIZE_EMAIL), "\n"; // [email protected]
$comment = "<script>alert(1)</script>Hi";
echo filter_var($comment, FILTER_SANITIZE_SPECIAL_CHARS), "\n";Output:
[email protected]
<script>alert(1)</script>HiPassare opzioni e flag
Molti filtri accettano opzioni aggiuntive. Ad esempio, per validare un intero solo all'interno di un intervallo:
<?php
$options = [
"options" => ["min_range" => 1, "max_range" => 120],
];
var_dump(filter_var("130", FILTER_VALIDATE_INT, $options)); // bool(false)
var_dump(filter_var("25", FILTER_VALIDATE_INT, $options)); // int(25)Output:
bool(false)
int(25)I flag utili includono FILTER_NULL_ON_FAILURE (restituisce null invece di false), FILTER_FLAG_STRIP_LOW (rimuove i caratteri sotto ASCII 32) e FILTER_FLAG_IPV6 / FILTER_FLAG_IPV4 per restringere FILTER_VALIDATE_IP.
filter_input() — filtrare i dati della richiesta direttamente
filter_input() legge un valore direttamente da un superglobal (per nome) e lo filtra in un unico passaggio, così non si tocca mai il raw array $_POST / $_GET:
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixedIl parametro $type è uno tra INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV:
<?php
// In a real form handler:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email.";
} elseif ($email === null) {
echo "The email field was not submitted.";
} else {
echo "Got: $email";
}Nota i tre possibili risultati: un valore (superato), false (presente ma non valido), o null (il campo non esisteva). Per filtrare un intero form in una volta sola, vedi filter_var_array() e filter_input_array().
Costanti dei filtri più comuni
| Filtro | Tipo | Scopo |
|---|---|---|
FILTER_VALIDATE_EMAIL | validazione | Indirizzo email |
FILTER_VALIDATE_URL | validazione | URL |
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT | validazione | Numeri interi / decimali |
FILTER_VALIDATE_IP | validazione | Indirizzo IPv4 / IPv6 |
FILTER_VALIDATE_BOOLEAN | validazione | "yes", "on", "1" → true |
FILTER_SANITIZE_EMAIL | sanitizzazione | Rimuove i caratteri email non validi |
FILTER_SANITIZE_URL | sanitizzazione | Rimuove i caratteri URL non validi |
FILTER_SANITIZE_NUMBER_INT | sanitizzazione | Mantiene le cifre e + - |
FILTER_SANITIZE_SPECIAL_CHARS | sanitizzazione | Codifica HTML < > & " ' |
Deprecato da PHP 8.1:
FILTER_SANITIZE_STRING(e il suo aliasFILTER_SANITIZE_STRIPPED). Per l'escape dell'output usahtmlspecialchars(); per pulire l'input preferisci un filtro di validazione specifico più un escape contestualmente appropriato al momento dell'uso.
Quando dovrei usarlo?
- Verificare un modulo di registrazione o contatto prima di salvare — abbinalo a PHP Form Validation e alla validazione di campi URL e e-mail.
- Confermare che un
idnella query string sia un intero positivo prima di una query al database. - Leggere e considerare affidabili i valori dai cookie o da
$_SERVER.
Il filtraggio integra, ma non sostituisce, altre difese: usa le istruzioni preparate (PHP MySQLi prepared statements) contro l'SQL injection e htmlspecialchars() quando si mostrano dati utente in HTML. Per regole basate su pattern che l'estensione filter non riesce a esprimere, ricorri alle espressioni regolari.