W3docs

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:

  • Validazioneverifica se un valore corrisponde a una regola e restituisce il valore se corrisponde, oppure false in caso contrario. Non modifica mai il valore. Usa i filtri FILTER_VALIDATE_*.
  • Sanitizzazionerimuove 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): mixed

Validazione

<?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)); // string

Output:

Email is valid
int(42)
bool(false)
string(18) "https://w3docs.com"

Attenzione: i filtri di validazione restituiscono false in caso di fallimento, ma 0 e "" sono anch'essi falsy. filter_var("0", FILTER_VALIDATE_INT) restituisce int(0), che fallisce un semplice if. Confronta con === false, oppure passa FILTER_NULL_ON_FAILURE in modo che i fallimenti diventino null e 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]
&#60;script&#62;alert(1)&#60;/script&#62;Hi

Passare 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): mixed

Il 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

FiltroTipoScopo
FILTER_VALIDATE_EMAILvalidazioneIndirizzo email
FILTER_VALIDATE_URLvalidazioneURL
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOATvalidazioneNumeri interi / decimali
FILTER_VALIDATE_IPvalidazioneIndirizzo IPv4 / IPv6
FILTER_VALIDATE_BOOLEANvalidazione"yes", "on", "1"true
FILTER_SANITIZE_EMAILsanitizzazioneRimuove i caratteri email non validi
FILTER_SANITIZE_URLsanitizzazioneRimuove i caratteri URL non validi
FILTER_SANITIZE_NUMBER_INTsanitizzazioneMantiene le cifre e + -
FILTER_SANITIZE_SPECIAL_CHARSsanitizzazioneCodifica HTML < > & " '

Deprecato da PHP 8.1: FILTER_SANITIZE_STRING (e il suo alias FILTER_SANITIZE_STRIPPED). Per l'escape dell'output usa htmlspecialchars(); 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 id nella 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.

Esercitazione

Pratica
In cosa aiuta PHP Filters quando si lavora con l'invio di dati?
In cosa aiuta PHP Filters quando si lavora con l'invio di dati?
Was this page helpful?