W3docs

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 false in caso di fallimento. Il valore non viene modificato.
  • Sanitizzaretrasformare 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:

FiltroCompitoEsempio d'uso
FILTER_VALIDATE_EMAILValidareVerificare un indirizzo email
FILTER_VALIDATE_INTValidareVerificare un intero, opzionalmente entro un intervallo
FILTER_VALIDATE_FLOATValidareVerificare un numero in virgola mobile
FILTER_VALIDATE_URLValidareVerificare un URL
FILTER_VALIDATE_IPValidareVerificare un indirizzo IPv4/IPv6
FILTER_SANITIZE_FULL_SPECIAL_CHARSSanitizzareCodificare i caratteri speciali HTML
FILTER_SANITIZE_NUMBER_INTSanitizzareEliminare tutto tranne le cifre e +/-
FILTER_SANITIZE_EMAILSanitizzareRimuovere 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_UNICODE permette caratteri internazionali nella validazione delle email.
  • Funzioni callback: consentono di passare una funzione personalizzata a FILTER_CALLBACK per logiche di validazione o sanitizzazione su misura.
  • Filtraggio di array: usa filter_var_array() o filter_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

php— editable, runs on the server

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

php— editable, runs on the server

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 è legittimamente 0 o "0", un controllo ingenuo if (filter_var(...)) lo tratta come fallimento. Confronta esplicitamente con false usando 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) o false; non esegue mai la sanitizzazione. Se hai bisogno di una stringa pulita, usa un filtro FILTER_SANITIZE_*.
  • La validazione dell'email non è una verifica della consegna. FILTER_VALIDATE_EMAIL controlla solo la sintassi — non può confermare che la casella di posta esista. Aggiungi FILTER_FLAG_EMAIL_UNICODE se 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.

Esercizio

Pratica
Quali dei seguenti filtri sono usati in PHP?
Quali dei seguenti filtri sono usati in PHP?
Was this page helpful?