Requête préparé et sécurité, c'est sûr ou non?

Eléphant du PHP | 142 Messages

16 mars 2009, 20:11

Hello,
je me posait une question, mon prof s'en posait une et un "testeur de sécurité" (pour rester poli envers lui) s'en posait aussi.

La question est est-ce que les requête préparée, via le fait que c'est automatiquement "binder" assure à 100% que il n'y aura pas d'injection sql?

Je suis quasi certain que c'est le cas, mais j'ai un doute, d'où mon message ici pour poser la question.

Si ce n'est pas le cas, que faire pour augmenter la sécurité?.

merci

Mammouth du PHP | 1668 Messages

16 mars 2009, 21:19

contre les injections SQL, oui
En revanche, pour le typage, je suis moins sûr : un "malin" pour tenter de mettre un char dans un integer, donc il y aurait erreur, sauf sous les SQLite X
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 5924 Messages

17 mars 2009, 01:15

Je vais donner une réponse un tout petit peu différente : Non.
A savoir que cela dépend comment tu l'utilises. Si tu n'as aucune intervention de variables dans la construction de ta requête, à priori, tu n'as pas de peur à avoir. Mais tu peux très bien faire ta requête ainsi :

Code : Tout sélectionner

"SELECT truc FROM tab WHERE champ=\"$var\""
sans utiliser la préparation de requête. Tu me diras, c'est évident, mais il faut le préciser.

Maintenant, comme le dit katagoto, à priori, s'il n'y a pas de faille, les requêtes préparées sont stables et sécurisées. Concernant les types, c'est à toi de préciser les bons types des champs lorsque tu injectes les données, ainsi, même si les données sont incorrectes en entrées, elles seront bien typées dans le requête. Mais dans les deux cas, ce n'est pas un problème de sécurité, mais seulement de fiabilité des données.

Si bug il doit y avoir, je pense qu'il sera au niveau du programme en lui-même. Ce n'est pas parce qu'on utilise des requêtes préparées que le programme va être sécure. Les failles viennent du programmeur lui-même, à savoir des failles directes, qui vont permettre à quelqu'un de directement modifier des données (injections SQL) voire faire exécuter du code (failles eval ou includes), ou indirectement, par exemple en fournissant des données exotiques pour exploiter des erreurs de traitement du programme (S'inscrire sous un login admin, mettre du html dans des champs texte). Les requêtes préparées ne sont donc que des outils.

Après, sur la question même de la sécurité des requêtes préparées, j'ai peu de doutes, mais on peut inviter d'autres personnes à donner leur avis…

Eléphant du PHP | 142 Messages

17 mars 2009, 01:31

merci, c'est ce que j'attendais.

Pour l'instant cela me conforte dans mon idée et cela me parait si simple (depuis que je les utilise) que j'ai des doutes tellement cela en est beau.

ViPHP
ViPHP | 5924 Messages

17 mars 2009, 02:56

Il n'y a pas de secret, cela revient à faire :

Code : Tout sélectionner

"SELECT truc FROM tab WHERE champ=\"" . mysql_real_escape_string($variable) . "\""
Les seules différences, c'est que c'est plus simple à utiliser, et que ça te fait plusieurs filtres en fonction du type désiré…