IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel récapitulatif de sécurité (PHP5)

Date de publication : 12 mai 2006 , Date de mise à jour : 12 mai 2006




I. Introduction : filtrer en entrée, échapper en sortie


I. Introduction : filtrer en entrée, échapper en sortie

Lorsqu'il s'agit de développer une application, il faut toujours considérer l'aspect sécurité avec une très grande attention. C'est relativement simple à mettre en place, puisqu'il suffit généralement de filtrer les entrées et de protéger l'affichage (échappement). En anglais, cela se traduit par quatre simples mots : "filter input, escape output".
Considérons un exemple dans lequel aucune de ces deux actions n'est menée :
Fichier : test_xss_1.php
<?php
echo '<u>Données brutes : </u>'.$_GET['foo'];
?>
Maintenant, effectuons quelques appels à ce script :
  • test_xss_1.php?foo=Bouh!
  • test_xss_1.php?foo=%3Cscript%3Ealert%28%22XSS%22%29%3B%3C%2Fscript%3E
J'imagine que vous avez pu remarquer l'ampleur des dégâts si vous n'avez pas désactivé Javascript (N.B. : ce serait dommage de le faire).
Ici, il y a deux problèmes : nous utilisons directement une variable provenant de l'utilisateur, sans effectuer aucun contrôle. C'est suicidaire. Ensuite, nous n'envoyons pas au navigateur les données au format qui convient, puisque nous les envoyons telles quelles.
Dès lors, il est très facile d'aller bien plus loin. Nous pourrions exécuter n'importe quelle commande Javascript, ce qui permet de faire pas mal de choses intéressantes... Je laisse libre cours à votre imagination !
Pour éviter ce genre de problèmes, il suffit généralement de filtrer les données et/ou de les échapper avant de les afficher.
Fichier : test_xss_2.php
<?php
echo '<u>Filtrage en entrée :</u> '.strip_tags($_GET['foo']);
echo '<br />';
echo '<u>Protection en sortie :</u> '.htmlentities($_GET['foo'], ENT_QUOTES, 'UTF-8');
?>
Mais voilà, je vous vois très bien faire la grimace... Oui, c'est fastidieux d'appeler systématiquement des fonctions pour utiliser des variables. Le simple fait de le faire est pénible, mais le véritable problème est plutôt que nous ne sommes pas à l'abri d'un oubli. Pourtant, un seul oubli peut être fatal !
L'informatique est un outil qui peut nous permettre d'éviter de répéter des tâches manuellement, même dans le code que nous écrivons. Autant en tirer parti !
Ainsi, je terminerai cet article en décrivant une méthode, connue sous le nom de poka-yoké, qui va nous permettre d'utiliser nos données de telle manière qu'il nous sera impossible de nous tromper (une erreur syntaxique empêchera l'exécution du script). Je donnerai les exemples en PHP5 mais, comme souvent, n'importe quel langage de script permet de faire quelque chose de similaire.



Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.