Validazione e filtro dell’input di un utente. La nuova filter_var()

Oggi mi sono trovato di fronte al classico form di registrazione di un utente con relativo form di login.
La mia prima preoccupazione è stata ovviamente la validazione e il filtraggio dell’input dell’utente.

Ero già pronto a prendermi le classiche espressioni regolari per controllare email, input di testo, date ecc… Ma proprio oggi leggevo un interessantissimo articolo su mattiasgeniar.be, un buon blog di uno sviluppatore, dove veniva presentata un’innovativa soluzione, introdotta con PHP5, per validare e filtrare l’input degli utenti: filter_var().

Ammetto di essere rimasto affascianato dalla semplicità con cui ora posso validare e filtrare i dati.
Ecco alcuni esempi (Attenzione: filter_var() è presente SOLO da PHP5 in poi).

Validazione di una mail:

<?php
   if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) echo 'Email non valida';
?>

Strip di tutto ciò che non è una stringa (pensiamo ad esempio ad un commento nel nostro blog):

<?php
   $commento = "<h1>Ciao a tutti, il mio <a href='http://www.google.it'>blog è qui</a></h1>";
   $commento = filter_var($commento, FILTER_SANITIZE_STRING);
   // Restituisce Ciao a tutti, il mio blog è qui
?>

E questi sono solo due semplicissimi esempi che solitamente necessitano di strip_tags, espressioni regolari ecc…
Onestamente trovo questo filter_var una vera manna!

Vi lascio il link di tutti i possibili parametri (sono veramente molti) per la filter_var:
http://mattiasgeniar.be/2009/02/07/input-validation-using-filter_var-over-regular-expressions/

Approfondisci

PHP: strip_tags, eliminare tag HTML da un testo con eccezioni

Tutti noi sappiamo che per eliminare i tag HTML da una stringa (ad esempio da un form inviato da un utente) possiamo utilizzare la comoda funzione nativa di PHP strip_tags().

Se abbiamo ad esempio una stringa inviata da un utente malintezionato, che vuole inserire del codice HTML (un link ad un sito ad esempio…) possiamo fare così:

$commento = strip_tags($_POST['commento']);

E se volessimo invece abilitare all’utente la possibilità di mettere un testo in grassetto?

Possiamo fare così:

$commento = strip_tags($_POST['commento'],'<strong>');

Nel caso volessimo abilitare più di un tag possiamo utilizzare questa sintassi:

$commento = strip_tags($_POST['commento'],'<strong>,<a>');

In questo modo l’utente avrà la possibilità di mettere link e grassetti.

Attenzione: strip_tags() elimina tutti i tag HTML, ma anche i tags PHP !

Per approfondimenti: http://it2.php.net/manual/it/function.strip-tags.php

Approfondisci

PHP: Apici o Doppi apici? Questo è il problema.

Cosa è meglio usare quando stampiamo delle stringhe in PHP? Gli apici o i doppi apici?

A livello di risultato non cambia assolutamente nulla, ma è importante sapere che i doppi apici rendono il nostro codice più pesante per il server. Questo significa che la pagina ci metterà di più ad essere renderizzata.

Si tratta ovviamente di differenze veramente piccole, ma se consideriamo un progetto di una ventina di pagine .php capiamo che è comunque importante soffermarci per ottimizzare il nostro codice.

Partiamo da una cosa importante: PHP non riconosce le variabili all’interno di una stringa delimitata da due apici. Ciò significa che questa riga di codice:

$nome = 'Massimiliano';
echo 'Ciao mi chiamo $nome !';

Stamperà a video questo: Ciao mi chiamo !

Questo accade perchè PHP si aspetta solo testo all’interno dei due apici e ignora qualsiasi variabile all’interno.

Ci sono due soluzioni a questo:

1. Usare i doppi apici

$nome = 'Massimiliano';
echo "Ciao mi chiamo $nome !";

2. Scorporare le variabili

$nome = 'Massimiliano';
echo 'Ciao mi chiamo '.$nome.' !';

Entrambe le soluzioni sono corrette ma quale usare?

In linea generale abbiamo detto che gli apici sono “più leggeri” per cui io opto per la soluzione numero 2, che produce, a parer mio, un codice anche più pulito.

Vedere con il nostro editor una variabile scorporata dal testo, rende il codice più leggibile e comprensibile.

L’ultima cosa è ricordarsi (per la regola della leggerezza) di utilizzare questa sintassi:

$nome = $_POST['nome'];

e non questa (doppi apici = più pesante):

$nome = $_POST["nome"];

Approfondisci