Avant de commencer notons que l'élément important de cette sécuristaion est la fonction php htmlspecialchars.
En effet prenons l'exemple d'un formulaire tout simple.

Le formulaire

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Mon formulaire pas sécurisé</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="traitement.php">
<p>Quel est votre nom ? <input name="nom" type="text" id="nom" size="20" maxlength="20" /></p>
<p><input type="submit" value="Baptise" /></p>
</form>
</body>
</html>

Dès lors, la page traitement.php que vous pourriez utiliser ressemblerait à ceci :

la page de traitement

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Affiche le nom</title>
</head>
<body>
<p>Bonjour, votre nom est : <?php echo $_POST['nom']; ?></p>
</body>
</html>

Ce n'est absolument pas sécurisé !

En effet l'utilisation du echo permet d'inscrire n'importe quel code HTML et est donc une faille potentielle
Mais comment regler ceci me direz-vous. Sechez donc les gouttes de sueur qui perlent sur votre front, la solution existe !

Il faut et il suffit (pour la plupart des utilisateurs en tout cas) de supprimer tout caractère suspicieux et notamment les "<" et ">".
Ca tombe bien une fonction php s'occupe de faire cela très bien, j'ai nommé : htmlspecialchars.
Ainsi htmlspecialchars va remplacer :

  • "&" (et commercial) qui devient "&amp;"
  • """ (guillemets doubles) qui devient "&quot;" lorsque ENT_NOQUOTES n'est pas utilisée.
  • "'" (single quote) qui devient "&#039;" uniquement lorsque ENT_QUOTES est utilisée.
  • "<" (inférieur à) qui devient "&lt;"
  • ">" (supérieur à) qui devient "&gt;"
La fonction s'utilise donc de la manière suivante : string htmlspecialchars ( string string [, int quote_style [, string charset]] ).
Ne vous inquiètez pas, nous allons détailler quelque peu cette fonction et notamment ses arguments.

Les arguments de htmlspecialchars
  • string string
  • Tout simplement la chaîne de caractères que vous voulez traiter.
  • int quote_style
  • Ici vous avez le choix entre :
    • ENT_COMPAT
    • Constante par défaut, elle convertit les guillemets double et ignore les simples.
    • ENT_QUOTES
    • Qui convertit à la fois doubles et simples.
    • ENT_NOQUOTES
    • Qui ignore à la fois doubles et simples
  • string charset
  • Le dernier argument (optionnel), vous permet de spécifier le jeu de caractères utilisé durant la conversion (par défaut ISO-8859-1)

En définitive, notre page traitement.php ressemblera donc à ça :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Affiche le nom</title>
</head>
<body>
<p>Bonjour, votre nom est : <?php echo htmlspecialchars($_POST['nom'], ENT_QUOTES); ?></p>
</body>
</html>

Voilà, plus de caractères dangereux, c'est là un premier pas vers une plus grande sécurisation de vos formulaires, il ne vous plus plus qu'à vous rendre à vos claviers !

Aller plus loin

N'hésitez pas à vous renseigner sur les fonctions htmlentities ou htmlspecialchars_decode qui pourront peut-être aussi vous servir