Validazione dei dati in PHP

23 dicembre 2016

In questo capitolo descriveremo gli strumenti di PHP per validare e/o "ripulire" dati attraverso la funzione filter_var().

Esistono due macrotipi di filtri che possiamo utilizzare con essa:

  1. validation: verificano che un dato sia o meno valido;
  2. sanitizazion: modificano il dato per renderlo valido.

Validation dei dati

La validazione di un indirizzo email è probabilmente il caso più comune di utilizzo di filter_var():

$emailValida = "test@gmail.com";
$emailNonValida = "invalid.email";

if (filter_var($emailValida, FILTER_VALIDATE_EMAIL)) {
    echo "$emailValida valida";
}

if (filter_var($emailNonValida, FILTER_VALIDATE_EMAIL)) {
    echo "$emailNonValida valida";
}

Il primo if stamperà la stringa “email valida”; nel secondo caso, dato che abbiamo utilizzato una stringa che contiene una mail non valida, non verrà stampato nulla.

Abbiamo visto che filter_var() prende in ingresso due parametri:

  1. la variabile da validare;
  2. il filtro per verificare se il dato è valido.

e restituisce come valore un booleano.

Vediamo quali sono i filtri a disposizione:

Filtro Descrizione
FILTER_VALIDATE_BOOLEAN Restituisce true per i valori "1", "true", "on" e "yes".
FILTER_VALIDATE_EMAIL Verifica la validità di una mail.
FILTER_VALIDATE_FLOAT Verifica che una variabile sia un float valido.
FILTER_VALIDATE_INT Verifica che la variabile sia un intero valido. È possibile anche verificare che sia compreso in un range.
FILTER_VALIDATE_IP Verifica la validità di un IP.
FILTER_VALIDATE_REGEXP Verifica che la variabile sia valida per un’espressione regolare.
FILTER_VALIDATE_URL Verifica la validità di un URL

Abbiamo detto che in FILTER_VALIDATE_INT è possibile definire un range di interi in cui la variabile dovrebbe essere compresa. Vediamo qualche esempio di utilizzo creando un array di numeri e passandoli ad una funzione che ne verifica la validità. Supponiamo inoltre che un valore sia valido se intero e compreso tra 1 e 5:

$valori = [
    '1',
    '-1',
    '2.0',
    'asd',
    '0',
    '5',
    '10',
];

function validaIntero($valore) {
    $options = [
        'options' => [
            'min_range' => 1,
           'max_range' => 5,
        ]
    ];

    if (filter_var($valore, FILTER_VALIDATE_INT, $options)) {
        echo "Il valore $valore è valido\n";
    } else {
        echo "Il valore $valore non è valido\n";
    }
}

foreach($valori as $valore) {
    validaIntero($valore);
}

Il risultato che otterremo è:

Il valore 1 è valido
Il valore -1 non è valido
Il valore 2.0 non è valido
Il valore asd non è valido
Il valore 0 non è valido
Il valore 5 è valido
Il valore 10 non è valido

Sanitization dei dati

Oltre che validare un dato possiamo anche modificarlo affinché il PHP provi a renderlo valido:

$email1 = "test@gmail.com";
$email2 = "(test@gmail.com)";
$email3 = "testATgmail.com";

function sanitizzaEmail($email) {
    $emailSanitizzata = filter_var($email, FILTER_SANITIZE_EMAIL);
    $emailValida = filter_var($emailSanitizzata, FILTER_VALIDATE_EMAIL);

    echo "Indirizzo email: $email\n";
    echo "Indirizzo email sanitizzato: $emailSanitizzata\n";
    echo "Email valida: " . ($emailValida ? 'SI' : 'NO') . "\n\n";
}

sanitizzaEmail($email1);
sanitizzaEmail($email2);
sanitizzaEmail($email3);

Risultato:

Indirizzo email: test@gmail.com
Indirizzo email sanitizzato: test@gmail.com
Email valida: SI

Indirizzo email: (test@gmail.com)
Indirizzo email sanitizzato: test@gmail.com
Email valida: SI

Indirizzo email: testATgmail.com
Indirizzo email sanitizzato: testATgmail.com
Email valida: NO

Nel primo caso avevamo una mail valida quindi era facile aspettarsi un risultato positivo. Nel secondo PHP ha provato a modificare il valore e ha restituito un’email valida. L'ultimo caso non ha avuto risultato positivo neppure dopo aver applicato FILTER_SANITIZE_EMAIL.

Come per la validazione, anche la sanitizzazione dei dati ha diversi filtri:

Filtro Descrizione
FILTER_SANITIZE_EMAIL Rimuove tutti i caratteri eccetto lettere, numeri e !#$%&'*+-/=?^_`{
FILTER_SANITIZE_ENCODED Codifica un URL.
FILTER_SANITIZE_MAGIC_QUOTES Applica la funzione addslashes() alla stringa.
FILTER_SANITIZE_NUMBER_FLOAT Rimuove tutti i caratteri eccetto numeri e i simboli + e –
FILTER_SANITIZE_NUMBER_INT Rimuove tutti i caretteri eccetto i simboli + e –
FILTER_SANITIZE_SPECIAL_CHARS Escape HTML dei caratteri '"<>&
FILTER_SANITIZE_FULL_SPECIAL_CHARS Equivale a richiamare la funzione htmlspecialchars() con il parametro ENT_QUOTES.
FILTER_SANITIZE_STRING Rimuove tutti i tags, opzionalmente codifica i caratteri speciali.
FILTER_SANITIZE_STRIPPED Alias del filtro FILTER_SANITIZE_STRING.
FILTER_SANITIZE_URL Rimuove tutti i caratteri eccetto lettere, numeri e $-_.+!*'(),{}
FILTER_UNSAFE_RAW Non compie operazioni, opzionalmente rimuove o codifica caratteri speciali.

Nel caso avessimo bisogno di passare un URL come parametro GET di una richiesta HTTP abbiamo bisogno di codificarlo così da non creare problemi nell'interpretazione dell’URL. Sui dettagli riguardo al metodo GET e alle richieste HTTP in generale ci occuperemo nella prossima lezione, per ora limitiamoci a dire solo che un parametro GET è un parametro che possiamo passare ad una URL. Ad esempio:

http://localhost/test/?redirect=<<indirizzo a cui fare il redirect>>

Per passare come parametro GET un URL su cui fare il redirect abbiamo bisogno di un encoding usando il filtro FILTER_SANITIZE_ENCODED:

$url = "http://localhost/test/?firstName=Simone&lastName=D'Amico";
echo filter_var($url, FILTER_SANITIZE_ENCODED);

che restituirà:

http%3A%2F%2Flocalhost%2Ftest%2F%3FfirstName%3DSimone%26lastName%3DD%27Amico

A questo punto potremmo salvare il valore in una variabile da appendere alla stringa del redirect.

Tutte le lezioni

1 ... 31 32 33 ... 49

Se vuoi aggiornamenti su Validazione dei dati in PHP inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Validazione dei dati in PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy