MySql et injection + PDO prepared et BindValue - une grosse faille MYSQL

Hum, hello.

Comment ce fait-il que cette requete retourne un enregistrement ,alors que la colonne no_ADMINIS est de type int?

La même requête executée avec pdo et bindValue/param retourne tjr un enregistrement, même si aucune données de la colonne n’est égale à ce qui est entre les doubleQuote ou simple quote.

Si je fais avec un like je n’ai pas se problème, mais je m’expose à l’exploit du %.
Meme avec pdo (php)

C’est comme si le = se fouttait des quotes et ne tenait compte que des espaces, ce qui est étrange non? :sweet:

Tout simplement parce que mySQL ou PDO doit parser la chaîne comme un entier, et ça retourne 1 immanquablement?

Tu nous dis que no_ADMINIS est un entier
Pour moi, l’expression “1 OR no_ADMINIS=2” devrait retourner vrai ou faux.

M’étonnerait que ça passe avec les requêtes préparées mais si tu me donnes le schéma de ta table, je testerai ce soir.

Grmble.

Le SGBD va voir que tu as ça :

int = string

Alors naturellement il va chercher à caster la chaîne en entier. Et 1 OR … ça se caste en 1 avec strtod et équivalent.

Ok, donc si je veux me protéger contre l’injection SQL je devrai convertir la variable en Int avant de la comparer pour ne pas que des petits malin poussent des valeur de varchar/text.

En fait je vois pas ton problème. Si “1 OR j’sais_pas_quoi = 2” est une variable utilisateur, tu devrais pas être gêné par le fait que tu reçoives 1 tout court à la place.
Si c’est le cas, ce n’est pas de l’injection utilisateur que tu dois te protéger, tu devrais plutôt voir ce que tu es en train de demander à tes utilisateurs.

Y a aucune injection, ou plutôt c’est mySQL qui est trop laxiste: une chaîne ne contenant pas que des nombres (ou un nombre valide) devrait être castée en NULL, pour indiquer que c’est invalide, et rien ne matcherait.

Maintenant, ton problème réside dans ce que tu fais : si tu fais une requête pour sélectionner des administrateurs et que tu permet à quelqu’un d’y injecter des données (en gros, si tu arrive à mettre “1 OR …” et que c’est quelqu’un qui l’a mis via une variable Get, Post, Cookie, …) , c’est que tu as un problème.

Peut-être est-ce normal? Exemple : un administrateur administrant un autre compte admin, dans ce cas faut vérifier derrière si cet admin peut modifier les autres comptes admin, etc.