W3docs

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, vedi filter_input_array().

Sintassi

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
ParametroObbligatorioDescrizione
$typeLa sorgente di input: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER oppure INPUT_ENV.
$var_nameIl nome della variabile da leggere, ad es. 'email'.
$filterNoUn ID filtro come FILTER_VALIDATE_EMAIL. Il valore predefinito è FILTER_DEFAULT (nessun filtraggio).
$optionsNoUn 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;
  • false se il filtraggio (validazione) fallisce;
  • null se 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 oppure false in 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 invece FILTER_SANITIZE_FULL_SPECIAL_CHARS (oppure htmlspecialchars() 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 &lt;b&gt;Joe&lt;/b&gt;.

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:  &lt;b&gt;Jane&lt;/b&gt;
Email: [email protected]
Age:   34

Nota: filter_input() legge le variabili che PHP ha catturato dalla richiesta HTTP effettiva, non i valori che assegni successivamente a $_GET/$_POST nel codice. Questo lo rende resistente alle manomissioni, ma significa anche che la funzione restituisce null per ogni campo quando uno script viene eseguito dalla riga di comando senza una richiesta sottostante — testa i filtri di input con filter_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_POST con il validatore corretto invece di fidarti delle superglobali grezze.
  • Paginazione, ID, prezziFILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT con un limite di intervallo rifiuta input fuori range o non numerici prima che raggiungano una query.
  • Form di contattoFILTER_VALIDATE_EMAIL e FILTER_VALIDATE_URL applicano 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).

Pratica

Pratica
Quali delle seguenti funzioni PHP sono usate per sanificare e validare i form?
Quali delle seguenti funzioni PHP sono usate per sanificare e validare i form?
Was this page helpful?