Sécurité des formulaires
Un grand principe : Ne faites jamais confiance aux données provenant d'une source externe.
Avec html5, il est déjà possible de filtrer les entrées grâce à require pattern dans les balises input.
Néanmoins il est impératif de vérifier les données d'un formulaire avant de les traiter afin d'éviter qu'un code malicieux soit introduit puis exécuté.
Supposons qu'à l'issue du remplissage d'un formulaire, vous récupériez le contenu de la variable $message.
Par exemple, si le contenu est tel que :
$message="blablabla <br><script>alert('Faille de sécurité');</script>";
Vous constatez que le début du message s'est affiché mais qu'un script s'est exécuté.
En PHP, plusieurs fonctions permettent de l'empécher.
• strip_tags(string text, string ignore)
supprime toutes les balises.
text est l'expression à tester, ignore contient les balises à garder.
On a écrit $message = strip_tags( $message, '<br>' ); pour tout enlever sauf les retours à la ligne (<br>)
• htmlEntities(string text)
remplace les caractères spéciaux par leur équivalent html.
text est l'expression à tester.
On a écrit $message = htmlEntities( $message );
• htmlSpecialChars(string text)
remplace 4 caractères spéciaux seulement : & < > " par leur équivalent html.
On trouve des fonctions de nettoyage :
• lTrim(string text)
supprime les espaces inutiles en début de texte.
• chop(string text)
supprime les espaces inutiles en fin de texte.
• trim(string text)
supprime les espaces inutiles en début et en fin de texte.
• nl2br(string text)
insère la balise <br> (retour chariot) avant chaque nouvelle ligne.
Insertion de texte dans un champ d'une table de données :
• addSlashes(string text)
ajoute un caractère antislash devant ' " et devant \\
En fait, on utilise cette fonction conjointement à get_magic_quotes_gpc()
qui indique si les guillemets sont supprimés automatiquement.
if (!get_magic_quotes_gpc() ) { $message = addSlashes( $message ); }
En retour, pour lire le texte précédemment encodé, on écrit :
$message = stripSlashes( $message );
• quoteMeta(string commande)
ajoute un caractère antislash devant ' \ + * ? [ ] ^ ( ) $
En retour, pour lire le texte précédemment encodé, on écrit :
$message = quoted_printable_decode( $message );
Codage et Décodage d'URL :
rawUrlEncode(string URL text)
exemple : Soit l'URL mail webmaster@koi29.info\n";
En encodant avec rawUrlEncode("mail webmaster@koi29.info"), on obtient mail%20%20%20webmaster%40koi29.info
Inversement, on utilisera rawUrlDecode(string URL text)
Codage de valeurs :
serialize(valeur)transforme une valeur en chaine.
Cette fonction permet de stocker une valeur ou un objet pour être utilisé plus tard.
Surtout intéressant pour stocker des données complexes.
Exemple :
$panier = array( array('machin',1.23) , array('truc',4.56) ,array('bazar',7.89) );
$data = serialize( $panier );
Ce qui donne à l'affichage :
a:3:{i:0;a:2:{i:0;s:6:"machin";i:1;d:1.23;}i:1;a:2:{i:0;s:4:"truc";i:1;d:4.56;}i:2;a:2:{i:0;s:5:"bazar";i:1;d:7.89;}}
En retour, on utilisera unSerialize(string data)