Classé dans la catégorie : Risque informatique
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
Si 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 ∖' 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.
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.
Si vous souhaitez participer à cette rubrique en soumettant des articles, ou des liens, n'hésitez pas...