A moins de limiter le nombre de lignes (LIMIT), tant qu'il en existe 2 (une avec id = 1 et l'autre avec id = 2 - supposant qu'id ait une contrainte unique), il devrait obtenir 2 lignes.
Parce que tu ne fais qu'un seul fetch ? La vraie requête a un LIMIT 1 ? L'id 2 n'existe pas ?
tant que le 1er paramètre sera trouvé, il ne renverra jamais le second, ce qui est logique
- Edité par Aurélien10! il y a environ 16 heures
Merci Aurélien.
En fait ce que j'essaie de faire c'est de provoquer une faille pour que je comprenne mieux les notions de sécurité web
C'est possible que en paramètre (dans l'url) je puisse mettre "?id=1 OR id = 2" en ayant préalablement effacer le membre 1 et que la requête fonctionne ?
- Edité par MouMouDu67 26 septembre 2021 à 13:37:57
> ce que j'essaie de faire c'est de provoquer une faille
C'est impossible avec une requête préparée (enfin, un paramètre de requête préparée), c'est justement un de leurs buts : tu ne peux pas binder un fragment SQL, il sera pris pour une vulgaire chaîne de caractères.
Mais :
tu aurais pu le préciser dès le départ
je ne comprends pas comment tu voulais le faire avec ta requête de départ (le "OR id = 2" étant hardcodé, il ne vient pas de l'utilisateur)
pas sûr de comprendre que "en ayant préalablement effacer le membre 1" change quelque chose à moins que l'on parte du principe que la requête ne soit censée retourner qu'une ligne (= tu ne fais qu'un fetch/ne considères que la première ligne) - point que ton code ne montre pas étant incomplet comme je l'ai déjà dit
Le vrai code (complet) ? La vraie intention ? Histoire que l'on sache réellement ce que tu cherches à faire et comment pour que l'on puisse y répondre de manière pertinente. Là, honnêtement, s'il faut deviner plus de moitié des choses, ça relève plus de la perte de temps pour tout le monde qu'autre chose.
donc vous pourrez comprendre avec ce bout de code (à la ligne 7-8) que la requête doit retourner une seule ligne. (C'est ce que je veux)
Voici l'url d'entrée "http://127.0.0.1:8080/site/?page=memberProfil&id=5 OR id=1"
L'id 5 n'existe pas dans ma base de donnée ; c'est fait intentionnellement.
C'est donc censé me renvoyé l'utilisateur dont l'id est 1, l'id 5 n'étant pas existant.
ma requête est transformé en ça "http://127.0.0.1:8080/site/?page=memberProfil&id=5%20OR%20id%20=%201"
Je me demande maintenant : Pourquoi ça ne passe pas ?
function getMembersInformations($memberID){
$db = dbConnect();
$query = $db->prepare("SELECT * FROM members WHERE id=?");
$query->execute([$memberID]);
return $query;
}
Je te l'ai dit : c'est impossible avec une requête préparée, ce qui est substitué par des marqueurs ne sont que des valeurs, pas du SQL (même partiel). C'est comme si ça finissait en SELECT * FROM members WHERE id = '5 OR id = 1' (noter les quotes), pas en SELECT * FROM members WHERE id = 5 OR id = 1 et avec MySQL, comme ta colonne est de type *INT, ça finit même interprété en SELECT * FROM members WHERE id = 5 car il caste comme PHP en s'arrêtant au premier non chiffre trouvé.
Si tu veux vraiment tester une injection SQL, il faut que tu injectes ta valeur ($memberID) directement dans la chaîne de requêtes (par concaténation ou interpolation).
Ce sont les but et raison des requêtes préparées : séparer/externaliser les données de la requête pour qu'une injection SQL soit impossible. Auparavant, en non-préparé, on injectait directement les valeurs dans la requête au risque justement que celles-ci modifient le sens de la requête si elles n'étaient pas correctement échappées/castées, en résultant alors une injection SQL.
Merci beaucoup pour ces précisions Julp . J'ai compris maintenant mais faut que je parte approfondir ces choses là maintenant.
- Edité par MouMouDu67 1 octobre 2021 à 19:00:29
La suite de ma requête est ignoré
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli