Il y a relativement peu de tutoriels qui parlent de la sécurité, lors de la validation des
données, du code PHP qui a évolué. Il existe une multitude de fonctions dédiées depuis
PHP 5.2 : les filtres de variable, l’extension PDO et les requêtes préparées.

La validation des données

Toutes les données récupérables sont à valider, qu’elles proviennent de
formulaire ou d’URL ($_GET _ $_POST). Il ne faut pas faire confiance aux utilisateurs (mauvaise manipulation,
pirate…) et vous méfier de vous-même (données imprévues…) ; en un mot, être paranoïaque !

Les filtres de validation

Ces filtres PHP servent à valider une donnée sans la modifier, et dans le cas où
la valeur n’est pas valide, la valeur false est retournée et si aucune valeur n’existe, null est retourné. En voici quelques unes :

  • FILTER_VALIDATE_INT : contrôle si la valeur est un nombre entier.
  • FILTER_VALIDATE_FLOAT : contrôle si la valeur est un nombre réel.
  • FILTER_VALIDATE_EMAIL : contrôle que la valeur soit bien un email (mais pas qu’il existe).
  • FILTER_VALIDATE_URL : contrôle que la valeur soit bien une URL (web).
  • Voir l’ensemble des filtres de validation.

Les filtres de nettoyage

Ces filtre PHP servent à convertir la donnée pour s’assurer qu’elle contient toujours le
format attendu, ce qui est le plus important. Voici les principales :

  • FILTER_SANITIZE_STRING : retire les balises HTML. ATTENTION, à ne plus utiliser à
    partir de la version PHP 8.0, utiliser htmlspecialchars() à la place.
  • FILTER_SANITIZE_SPECIAL_CHARS : code les caractères spéciaux en HTML et WML sous formes d’entités.
  • FILTER_SANITIZE_MAGIC_QUOTES : à éviter, car la directive de
    configuration magic_quotes_gpc est devenu obsolète. Le problème des injections SQL
    est un problème différent et spécifique à chaque type de base de données,
    il faut le gérer avec PDO::quote ou par exemple avec
    mysqli_real_escape_string().
  • Voir l’ensemble des filtres de nettoyage.

Exemple d’utilisation des filtres PHP

securite-PHP.jpgSi dans un formulaire de départ
vous avez un email : <input type= »text » name= »email » />
qui est passé en POST, voici le code dans le script qui reçoit et traite la valeur du champ email :

$email_controle=filter_input(INPUT_POST.’email’, FILTER_VALIDATE_EMAIL);

Il faut ensuite, bien sûr, traiter les 3 cas de figure : pas de valeur, mauvaise valeur et bonne valeur.

Voir la documentation en ligne.

La sécurité des données avec l’extension _ API_ PDO de PHP

L’extension PDO (PHP Data Object) offre la possibilité de coder l’accès
aux bases de données sans avoir à se préoccuper du moteur SGBD utilisé ; la seule
limite de portabilité est le contenu des requêtes SQL. Cela veut dire que votre code restera identique
que vous utilisiez MySQL, PostgreSQL, SQLite… D’autre part, attention car les anciennes instructions
PHP de type mysql_connect() risque d’être abandonnées
prochainement, orientez-vous à minima vers les
fonction commençant par mysqli,
comme mysqli_connect().

La gestion des apostrophes

Le plus grand risque de l’enregistrement des données dans une base est l’injection SQL
dûe à la (mauvaise) gestion des apostrophes. Ce caractère doit donc être
« échappé » (antislash devant &Backslash;’
ou doublé  »). L’extension PDO propose la méthode
quote() pour cette opération.

Les requêtes préparées

Les requêtes préparées nécessitent plus de ressources, il faut donc les
réserver pour les requêtes répétées au sein d’un même script.
L’avantage principal est que les requêtes préparées ne nécessitent pas
d’échappement des données. Le principe est de créer un model de requête qui
sera stocké en mémoire. Ensuite, il sera exécuté en utilisant les données
que vous aurez transmise en paramètre lors de la construction de la requête SQL.

Voir la documentation PDO en ligne.

Chargement...

Conclusion

Tous ces outils sécurisent mieux et simplifient le codage en PHP. Le seul inconvénient,
est qu’il va falloir vous mettre à la programmation de type objet, ce qui n’est pas une notion
des plus évidente, mais qui existe afin de factoriser au mieux les opérations et donc, au final,
de rationnaliser et simplifier le codage et surtout la maintenance de votre code.

 

Merci à Cyrille T. de Alterway pour ses corrections.

Tags associés :
Damien BART

Damien BART pour Inforisque

Partager :

Le Club, la communauté des professionnels de la prévention

Échangez avec vos pairs, partagez vos retours d’expérience, posez vos questions et développez votre réseau au sein de la plus grande communauté Santé &amp; Sécurité au Travail de France.

Découvrez La newsletter du risque !

Chaque semaine, recevez gratuitement « La Lettre du Risque », la newsletter d’Inforisque, avec une sélection d’actualités, de guides, de webinaires et d’événements pour enrichir votre veille en santé et sécurité au travail.

S'abonner