filter_input()
Come usare filter_input() in PHP per sanificare e validare input da GET, POST e cookie con FILTER_SANITIZE_* e FILTER_VALIDATE_*.
Introduzione
filter_input() è una funzione PHP incorporata che legge una singola variabile esterna — da $_GET, $_POST, cookie, dall'ambiente server o da getenv() — e la sottopone a un filtro in un unico passaggio. Un filtro può sanificare il valore (rimuovere o fare l'escape dei caratteri indesiderati) oppure validare il valore (verificare che corrisponda al formato atteso e rifiutarlo in caso contrario).
Il motivo principale per usare filter_input() invece di accedere direttamente a $_GET['x'] è la sicurezza by design: non si ottiene mai una superglobale grezza tra le mani, la funzione segnala chiaramente quando una variabile è assente, e il filtro viene applicato esattamente nel momento in cui si legge il valore. Questa pagina tratta la sintassi, la differenza tra sanificazione e validazione, come interpretare i tre possibili valori restituiti e un esempio completo di gestione di un form.
Stai cercando di filtrare un valore già presente in una variabile (non proveniente da una superglobale)? Usa
filter_var(). Per filtrare più campi contemporaneamente, vedifilter_input_array().
Sintassi
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Parametro | Obbligatorio | Descrizione |
|---|---|---|
$type | Sì | La sorgente di input: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER oppure INPUT_ENV. |
$var_name | Sì | Il nome della variabile da leggere, ad es. 'email'. |
$filter | No | Un ID filtro come FILTER_VALIDATE_EMAIL. Il valore predefinito è FILTER_DEFAULT (nessun filtraggio). |
$options | No | Un array associativo di opzioni/flag oppure una bitmask di flag. Usato per intervalli, valori predefiniti, regexp, ecc. |
Valori restituiti
filter_input() ha tre possibili valori restituiti, e distinguerli è il punto centrale del suo utilizzo:
- il valore filtrato in caso di successo;
falsese il filtraggio (validazione) fallisce;nullse la variabile non è impostata nella sorgente di input richiesta.
Poiché false e null hanno significati diversi, confronta sempre con === anziché un semplice controllo booleano.
Sanificazione vs. validazione
Questo è il punto di confusione più comune, quindi scegli con attenzione:
- Sanificare (
FILTER_SANITIZE_*) — pulisce il valore e restituisce la stringa pulita. Quasi mai "fallisce"; si limita a rimuovere o fare l'escape dei caratteri. - Validare (
FILTER_VALIDATE_*) — verifica il valore e lo restituisce invariato in caso di successo oppurefalsein caso di fallimento. Usalo quando il campo ha una forma rigida (email, intero, URL, boolean).
FILTER_SANITIZE_STRINGè stato rimosso in PHP 8.0. Usa inveceFILTER_SANITIZE_FULL_SPECIAL_CHARS(oppurehtmlspecialchars()al momento dell'output).
Sanificazione dell'input
L'esempio seguente legge un campo name da una richiesta POST ed esegue l'escape dei caratteri HTML speciali in modo che il valore sia sicuro da memorizzare e mostrare in seguito.
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($name === null) {
$name = ''; // field was not submitted at all
}
echo $name;FILTER_SANITIZE_FULL_SPECIAL_CHARS codifica in HTML ogni carattere speciale (simile a htmlspecialchars() con ENT_QUOTES), quindi <b>Joe</b> diventa <b>Joe</b>.
Validazione dell'input
Per i campi con un formato fisso, valida invece di sanificare. Qui FILTER_VALIDATE_EMAIL restituisce l'indirizzo in caso di successo o false in caso di fallimento:
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === null) {
echo "No email submitted.";
} elseif ($email === false) {
echo "Invalid email address.";
} else {
echo "Valid email: $email";
}Validazione di numeri con opzioni
Il quarto parametro consente di vincolare un valore. Questo accetta un numero di pagina intero solo quando è compreso tra 1 e 100, e usa 1 come fallback in caso contrario:
<?php
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 1,
'max_range' => 100,
'default' => 1, // returned when validation fails
],
]);
echo "Page: $page";Un esempio completo di form
In una richiesta reale si legge ogni campo direttamente dalla sorgente di input:
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120],
]);
$errors = [];
if ($email === false) {
$errors[] = 'Invalid email.';
}
if ($age === false) {
$errors[] = 'Age must be a whole number between 0 and 120.';
}
if ($errors) {
echo implode("\n", $errors);
} else {
echo "Name: $name\nEmail: $email\nAge: $age\n";
}Per un invio valido (name=<b>Jane</b>, [email protected], age=34) questo stampa:
Name: <b>Jane</b>
Email: [email protected]
Age: 34Nota:
filter_input()legge le variabili che PHP ha catturato dalla richiesta HTTP effettiva, non i valori che assegni successivamente a$_GET/$_POSTnel codice. Questo lo rende resistente alle manomissioni, ma significa anche che la funzione restituiscenullper ogni campo quando uno script viene eseguito dalla riga di comando senza una richiesta sottostante — testa i filtri di input confilter_var()su una stringa di esempio.
Quando usarlo
Usa filter_input() ogni volta che un valore entra nell'applicazione dall'esterno:
- Query string e form — leggi i campi
INPUT_GET/INPUT_POSTcon il validatore corretto invece di fidarti delle superglobali grezze. - Paginazione, ID, prezzi —
FILTER_VALIDATE_INT/FILTER_VALIDATE_FLOATcon un limite di intervallo rifiuta input fuori range o non numerici prima che raggiungano una query. - Form di contatto —
FILTER_VALIDATE_EMAILeFILTER_VALIDATE_URLapplicano la forma al confine. Vedi l'esempio dettagliato in PHP Form Validation.
Filtrare al confine di input mantiene la logica di validazione in un unico posto e la separa dalla business logic, rendendo il codice più facile da leggere, testare e verificare. Per l'elenco completo dei filtri disponibili, vedi PHP Filters.
Conclusione
filter_input() legge una variabile esterna e la filtra in un unico passaggio ben definito. Usa un filtro FILTER_VALIDATE_* quando un campo ha un formato rigido e un filtro FILTER_SANITIZE_* quando devi solo pulire un valore, e controlla sempre il risultato con === in modo da distinguere una variabile assente (null) da una non valida (false).