Désinfectons nos entrées PHP avec des filtres de validation

Si vous vous souciez un minimum de la sécurité de votre code et que vous connaissez les enjeux des injections SQL, des attaques du type Cross Site Scripting (XSS) et autres Cross-Site Request Forgery (CSRF,XSRF)…

La plupart des ses attaques sont tellement malicieuses (qui à dit tordues? :D), que le meilleur moyen pour bien gérer ses entrées en PHP est de les filtrer plus ou moins brutalement…

Pour ça, depuis la version 5.2.0 de PHP, des filtres et validateurs ont étés implémentés. Ils peuvent servir directement sur les ressources stream, par le biais des fonctions stream_* ou plus simplement, avec les fonctions de type filter_*.

Nous avons donc le choix entre différents filtres permettant de valider les types d’entrées que l’on souhaite obtenir. Un moyen simple de connaître les  filtres accessibles sur son installation est d’utiliser la fonction filter_list :

print_r(filter_list());

SANITIZE ou VALIDATE ?!

Prenons l’exemple du filtre sur un entier… On a le choix, on peut soit filtrer la variable en la bloquant (VALIDATE) avec FILTER_VALIDATE_INT, soit la filtrer en la nettoyant (SANITIZE) avec FILTER_VALIDATE_NUMBER_INT. C’est là toute la force de cette implémentation correcte des filtres…

La liste des constantes concernant les filtres sont disponibles ici. Cette liste peut aider car on est tenté d’utiliser directement le nom obtenu avec la fonction filter_list, pour en déduire son validateur et son filtre. J’ai par exemple essayé un simple FILTER_SANITIZE_INT, qui ne donne rien…

En dehors des simples filtres pour tester des entiers ou des chaines, on note par exemple le filtre FILTER_SANITIZE_EMAIL qui fait très bien ce qu’on lui demande :

   $value = 'foo(bar)@example.com';
   echo filter_var($value, FILTER_SANITIZE_EMAIL);

Cas pratique : création d’un filtre pour numéro de téléphone
Pour faire simple, on va prendre le cas du téléphone fixe français.

function sanitizeTelephoneFixe($x){
	$a = array('01','02','03','04','05');
	$x = filter_var($x, FILTER_SANITIZE_NUMBER_INT);
	if(strlen($x)!=10 || !in_array(substr($x,0,2),$a))
		return '00 00 00 00 00';
	else
		return preg_replace(array('/(d{2})(d{2})(d{2})(d{2})(d{2})/'),array('$1 $2 $3 $4 $5'),$x);
}

$a = '0x0A.23.4d5.67.89d.';
$b = '0f1.23.4d5.67.89d.';
$c = '031.d23.4f5.67x.8vc9.';
$d = '01.23.45.67.89.';
echo filter_var($a,FILTER_CALLBACK,array("options"=>"sanitizeTelephoneFixe")), '
',
filter_var($b,FILTER_CALLBACK,array("options"=>"sanitizeTelephoneFixe")) , '
',
filter_var($c,FILTER_CALLBACK,array("options"=>"sanitizeTelephoneFixe")) , '
',
filter_var($d,FILTER_CALLBACK,array("options"=>"sanitizeTelephoneFixe"));

Ce qui renverra :

00 00 00 00 00
01 23 45 67 89
00 00 00 00 00
01 23 45 67 89

Avec tout ça, vous prendrez un peu d ‘AJAX en dessert et vous serez tout propre! :D

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Spam Quiz: