Les filtres PHP : une fonctionnalité importante de sécurité

| Marc Poltz (Auteur) | Joris Crozier (Traducteur) |

Cet article est la traduction de PHP Filters: An Important Security Feature de Marc Plotz.

Il y a du bon code, et il y a du mauvais code. Cet article va vous apprendre comment faire en sorte que votre code tombe dans la bonne catégorie.

Commentez

- Titre : Les filtres PHP : une fonctionnalité importante de sécurité

- Auteurs : Marc Poltz (Auteur), Joris Crozier (Traducteur)

- Parution : 21 janvier 2010

- Licence : Copyright ® 2010 Joris CROZIER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le filtrage des variables

- III. Conclusion

- IV. Liens

I - Introduction

Peut-être que certaines des discussions les plus amusantes que j'ai vues dans les forums de développeurs sont les discussions pour savoir si PHP est un "vrai" langage de programmation ou non. Apparemment, il est dit que PHP n'aura jamais la puissance de Java, parce que PHP est un langage faiblement typé. Eh bien, oui. Ce que vous n'avez pas besoin de vous rappeler cependant, c'est que PHP n'a jamais été conçu pour être un clone de Java. PHP n'est pas un système à l'état solide. Il dure une fraction de seconde - alors que la page se charge - et alors il cesse de fonctionner. C'est tout. C'est la raison pour laquelle il existe des choses comme GET, POST et les sessions en PHP : dans un système non à l'état solide, dont vous avez besoin pour transporter l'information d'une page à l'autre. Bon, PHP fait ce pour quoi il a été conçu. Maintenant, le point que j'essaie de faire ici est que, oui, PHP est un langage faiblement typé - si vous codez pour qu'il le soit. Il appartient à la personne de la conception et la mise en œuvre du système de décider dès le début s'il va faire les choses correctement ou non. La même chose s'applique à vos techniques de validation.

La validation est peut-être la chose la plus importante que vous puissiez faire sur un site Web. Oublier de valider absolument toutes les parties de votre site Web ou une application qui interagit avec un utilisateur est probablement l'erreur la plus commune que vous puissiez faire. Je sais de par ma propre expérience que la validation peut être une douleur. Habituellement dans mon esprit cette énorme grappe de SWITCH commence à émerger chaque fois que quelqu'un commence à parler de validation. Si cela se passe pour vous maintenant, asseyez-vous et détendez-vous : PHP dispose en interne des fonctions de validation toutes prêtes pour que vous puissiez les utiliser à cette fin.

Les filtres PHP sont une extension de PHP qui vous aideront à facilement - et de manière fiable - valider les variables et les chaînes de caractères, de sorte que nous puissions espérer, qu'une chose comme cela ne se reproduise plus :

<?php
include($_GET['filename']);
?>

ou, pire encore,

<? php
mysql_query ( "INSERT INTO table (champ) VALUES ({$_POST [ 'value']})");
?>

II - Le filtrage des variables

Pour utiliser l'extension de filtre pour filtrer les variables, vous utilisez la fonction filter_var(). Essayons de valider le texte suivant comme un entier, par exemple.

<?php
$variable = 1122;
echo  filter_var($variable, FILTER_VALIDATE_INT);

Le résultat du echo est "1122" parce que le type de variable a été trouvé pour être un entier. Si la variable d'entrée était "A344" rien n'aurait été imprimé à l'écran car la validation a échoué. Ok, ok, je vois que vous vous dites que c'est un tour assez propre. Mais il y a plus. Supposons que nous voulons nous assurer que notre variable est un entier et a une valeur de plus de 5 et moins de 10. Comment ferions-nous cela?

<? php
$variable =6;
$minimum_value = 5;
$valeur_finale = 10;

echo filter_var($variable, FILTER_VALIDATE_INT, array ( "options" => array ( "min_range" => $minimum_value ", max_range" => $valeur_finale)));
?>

Donc, la variable devrait être dans les limites - comme elle l'est dans l'exemple ci-dessus - le numéro 6 sera affiché à l'écran.

PHP fournit également une très bonne façon de vérifier les valeurs float - particulièrement utile pour ceux d'entre nous qui construisent des paniers d'achat et ont la nécessité de vérifier que les valeurs ont deux décimales. L'exemple ci-dessous affiche "31.53 est un nombre à virgule flottante valide".

<? php

$num = 31.53;

if (filter_var($num , FILTER_VALIDATE_FLOAT) === false)
(
echo $num. "n'est pas valide!";
)
else
(
echo $num. "est un nombre à virgule flottante valide";
)

?>

Jamais essayé de valider une URL ? Si non, il est préférable que vous lisiez la RFC1738 - Uniform Resource Locators d'abord, puis ouvrez votre éditeur PHP et écrivez une classe qui décrit essentiellement les 2000 lignes de la RFC, non ?

Eh bien, non. En fait, PHP peut le faire automatiquement avec le filtre d'URL.

<?php

$url = "http://www.somewebsite.domain";

if(filter_var($url, FILTER_VALIDATE_URL) === FALSE)
{
echo $url." n'est pas une URL valide<br />";
}
else
{
echo $url." est une URL valide<br />";
}

?>

"http://www.somewebsite.domain est une URL valide" est la réponse que je reçois.

Maintenant passons à quelque chose qui m'énerve en vain : la validation des adresses e-mail. C'est l'une de ces choses qui nécessite une expression régulière, non ? Faux. FILTER_VALIDATE_EMAIL le fait de manière simple, sans une goutte de sueur. Allons-y :

<?php

$email = "marc@somehost.com";

if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
echo $email." est invalide";
}
else
{
echo $email." est valide";
}

?>

Maintenant, ne croyez-vous pas que cela en vaut la peine ? La validation d'email peut être un véritable casse-tête, surtout pour les débutants, donc à mon avis, c'est une petite bénédiction.

Mais il y a plus. La nécessité de supprimer les balises HTML dans une chaîne. Que pensez vous de cela ?

<?php
$string = "<p>text</p>";

echo filter_var($string, FILTER_SANITIZE_STRING);

?>

Le résultat est qu'il va simplement afficher "text" sans les balises.

III - Conclusion

Ce que nous avons étudié ici sont quelques exemples de ce que nous pouvons faire avec PHP FILTERS. Bien sûr, il est important de valider votre code - nous le savons tous. Mais le faire en réalité, c'est une autre histoire. Je suppose que cet article vous donne juste, que vous soyez un débutant ou un expert, un moyen d'être sûr que quelque chose est fait pour aider votre code dans son voyage du mauvais côté au bon. Que votre code soit le meilleur qu'il puisse être !

IV - Liens

Vous pouvez aussi aller voir mes autres traductions.

Merci à La Zélie, mseye, Caro-Line, Pierre Fauconnier, Bovino pour leur relecture orthographique et pour le débat que celles-ci ont créé :).