Au risque de me faire taper sûr les doigts si j’ai loupé quelque chose (ce qui est probablement le cas 😉 ) voici une petite fonction que j’ai pris l’habitude de caler devant toute page php utilisant les variables $_GET et / ou $_POST.
1 2 3 4 5 6 7 |
foreach ($_GET as $key => $value) { $sGET[$key]=htmlentities($value, ENT_QUOTES); } foreach ($_POST as $key => $value) { $sPOST[$key]=htmlentities($value, ENT_QUOTES); } |
Ce code permet simplement de déplacer toutes les variables $_GET & $_POST vers $sGET et $sPOST où chaque variables sera passé par htmlentities($value, ENT_QUOTES) autrement dit, les ‘ » / \ <i> … seront rendu « inoffensifs » pour toute requête SQL, insertion de code …
Il est possible de retrouver la version décodée grace à html_entity_decode() Ou en utilisant directement $_GET ou $_POST.
Pour ceux qui n’auraient pas compris toute variable posté en paramètre (http:://urldemonsite.fr/?parametre=valeur) ou par un formulaire <input … > sera sécurisé et utilisable sans risque dans une requête SQL ou autre …
[Edit 17/03/2015]
Voici une adaptation de mon code suite à la proposition de TigerCX que je remercie :).
1 2 3 4 5 6 7 8 9 10 11 |
function secureArray($array_sec){ foreach ($array_sec as $key => $value) { if(is_array($value)) { $array_sec[$key] = secureArray($value); } else { $array_sec[$key] = htmlentities($value, ENT_QUOTES); } } return $array_sec; } |
Cette version oeuvre différemment. Elle va traiter toutes les variables d’un tableau avec htmlentities, et si cette variable est un tableau la fonction va se rappeler elle-même pour traiter le sous tableau. (Ainsi toutes les données sont sécurisées, il n’y a pas de risque que le code php soit interrompu si l’on transmet un tableau dans un paramètre.)
Attention à la différence du premier code il faut appeler cette fonction et utiliser le tableau retourné par la fonction. Alors que le code précédent créait directement les variables $sGET …
L’appel sera similaire à :
1 2 |
$var_non_securise=array('foo',array('one','two','<script>'),'bar','déjà vu'); $var_securise=secureArray($var_non_securise); |
Le contenu de la variable $var_securise sera tel que :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Array ( [0] => foo [1] => Array ( [0] => one [1] => two [2] => <script> ) [2] => bar [3] => déjà vu ) |
Bonjour, a quoi sert le ENT_QUOTES ?
Bonjour,
Le ENT_QUOTES est un drapeau que l’on peut transmettre à la fonction htmlentities, elle permet de convertir les simples et doubles quotes » ‘ dans leur notation html.
Ceci nous servira a prévenir les injections SQL en cas d’utilisation dans une requête.
Exemple tiré de : http://php.net/manual/fr/function.htmlentities.php
Bonjour,
peut-on remplacer htmlentities par htmlspecialchars ?
Avec le htmlentities j’ai un problème d’affichage sur le ï
et pas avec htmlspecialchars…
Merci
La documentation de htmlentities sur php.net indique la chose suivante :
« htmlentities() est identique à la fonction htmlspecialchars(), sauf que tous les caractères qui ont des équivalents en entités HTML sont effectivement traduits. »
Le comportement est tout à fait similaire, mais htmlentities traduits tout les caractères qui ont un équivalent HTML et le ï possède en html la notation ï. Il ne devrait donc pas y avoir de soucis de ce coté là.
Je crains que le problème ne vienne de l’encodage du fichier UTF8 / ISO … et de celui déclaré dans l’entête de ton fichier HTML. Il y a peut être divergence et ton navigateur ne peut l’afficher correctement.
Essaye de voir de ce coté là.
Sinon je pense qu’il n’y a aucun problème à utiliser htmlspecialchars sans oublier le ENT_QUOTES également.
Je te met également les liens vers la documentation php des deux fonctions :
http://php.net/manual/fr/function.htmlentities.php
http://php.net/manual/fr/function.htmlspecialchars.php
Bien pensé comme concept. Si je peux me permettre, j’ai modifié le code pour accepter les tableaux à plusieurs niveaux
function securePost($array){
foreach ($array as $key => $value) {
if(is_array($value)) $array[$key] = securePost($value);
else $array[$key] = htmlentities($value, ENT_QUOTES);
}
return $array;
}
Bien vu, une fonction récursive est parfaite pour ce cas. Je l’intègre à l’article ;).