Ter Rowan a écrit :pour bien préciser :p
1) mysql_real_escape_string() suffit si je veux utiliser une saisie utilisateur (venant du poste client quoi) dans une requête SQL (que ce soit de l'update, de l'insert, du select)
2) est-il utile de toujours tester le "is_numeric" , dans le cas où la valeur 0 ne pose pas un risque (ie si =0 alors pas d'action)
ie. que se passe t il si
- toto = 3* $Post["toto"]; (avec "13aaaieri" ou "aeeer")
est ce que le résultat est : toto = 39 et toto = 0
Le resultat est simple à voir :
Code PHP :
<?php
$a = 3;
$b = '13aaaieri';
echo $a * $b;
?>
Cela donnera 39. Ce résultat est lié à la une chose amusante nommée le transtypage, qui est la conversion automatique d'une variable en fonction du type. Je ferais un tuto sur ça si vous voulez, c'est assez interessant à étudier les types en PHP.
Citation :- "Select * from truc where id =".mysql_real_escape_string($Post["toto"])
avec toto "aeee OR 1=1"
est ce que le résultat est : "Select * from truc where id =0" ou "Select * from truc where id = 0 OR 1=1"
Le résultat est "Select * from truc where id = 0 OR 1=1". mysql_real_escape_string ne fait qu'ajouter des antislash (\) devant les caractères que le serveur MySQL doit échapper (en gros, les guillemets et autres choses du même acabit). Ce n'est en aucun cas une filtration de type !
Pour faire de manière sécurisée, il faut utiliser is_numeric ou (plus simple) intval. J'utilise en général intval que je trouve beaucoup plus pratique puisque ça me permet de traiter ma requête sans tests :
"Select * from truc where id =".intval($Post["toto"])
Ceci donnera :
Select * from truc where id = 0
Bon, je vais vous faire un bon gros tuto sur le typage strict en php et comment l'utiliser...
Edit : Après la réponse de Sephi-Chan et un benchmark, (int) est plus adapté que intval() car il donne de meilleurs performances.