quelle est la signification de 'admin' or 1=1 — '
La requête suivante renvoie tous les mots de passe dans la table tbl_user mais je ne comprends pas pourquoi ce qui se passe.
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
S'il vous plaît aidez-moi à comprendre cette partie de la requête: 'admin' or 1=1 -- '
Pouvez-vous introduire d'autres menaces comme ceci (site web, livre, etc)?
C'est un classique de l'injection SQL. Il renvoie les utilisateurs dont le nom est
Vous pouvez retirer 1=1 car il ne fait rien
que voulez-vous dire?
C'est l'ensemble de point @Gadgetster. Il a certainement fait quelque chose. 😉
il n'a tout à fait le contraire de rien
admin
OU, où 1=1 (depuis le 1er est en effet 1 chaque enregistrement de match). Le --
tout à fait sûr eveyrthing après, il est considéré comme un commentaireVous pouvez retirer 1=1 car il ne fait rien
que voulez-vous dire?
C'est l'ensemble de point @Gadgetster. Il a certainement fait quelque chose. 😉
il n'a tout à fait le contraire de rien
OriginalL'auteur Daniyal | 2014-07-19
Vous devez vous connecter pour publier un commentaire.
C'est un classique de l'injection SQL.
Voir ce violon pendant que j'explique: SQLfiddle
Dans cet exemple, il y a 5 utilisateurs ajoutées à la table. Votre requête est ensuite exécuté. Le résultat attendu serait de retour la valeur de mot de passe pour le
admin
de l'utilisateur uniquement.Cependant, en ajoutant
1=1
, qui est un énoncé vrai, tous les mots de passe sont retournés.Une autre façon d'aider à visualiser ce, est d'ajouter des parenthèses, de sorte que vous pouvez voir comment tout est évaluée.
Donc, nous sommes en sélectionnant le mot de passe de la table où le nom d'utilisateur est
admin
. Nous sommes également en tirant le mot de passe de la table où jamais 1=1 - ce qui est toujours vrai. Chaque ligne est évaluée à true, donc tous les mots de passe sont retournés.La finale
-- '
est utilisé pour commenter le reste de votre requête.Normalement, (si le
1=1
n'avait pas été injecté), vous vous tirez le mot de passe pour l'utilisateur user_name de l'admin et superadmin autorisations. Vous avez commenté, et il n'est pas exécuté. C'est de cette façon l'ensemble de la table de mots de passe peuvent être retournés.OriginalL'auteur Andy
Le résultat d'une logique
OR
est comme suit:Le résultat de a OU b est évaluée à true, si l'un des opérandes est vrai.
=>
=>
renvoie la valeur true pour chaque ligne de votre tableau
Résultat:
sera de retour le mot de passe pour tous les utilisateurs, pas seulement pour les admins, car comme l'a déclaré PeeHaa
est le début d'un commentaire sql.
OriginalL'auteur VMai
Il y a 2 de possibles confusions, je peux imaginer que vous rencontrez ici. Le premier est, comme d'autres l'ont mentionné,
expr1 OR expr2
retourne vrai quandexpr1
ouexpr2
est vrai. Depuis1=1
est toujours vrai, votreWHERE
déclaration sera vrai pour chaque enregistrement de la table.La deuxième chose que vous pourriez être confus au sujet est le dernier
-- '
dans la requête. Le--
est le SQL équivalent de//
en PHP; elle indique que le reste de la ligne est un commentaire, et doit être ignorée. Si l'interprète de SQL est seulement la lectureSELECT password FROM tbl_users WHERE name = 'admin' OR 1=1
et en ignorant le reste de la ligne, c'est pourquoi que les apostrophe n'est pas à l'origine d'une erreur de syntaxe.Le seul risque pour la sécurité ici est de savoir si vous êtes de passage sans échappement saisie de l'utilisateur de SQL. Toujours échapper à tout utilisateur d'entrée avec mysqli_real_escape_string ou un équivalent de la fonction avant de l'utiliser dans une requête SQL.
Edit: Comme l'a souligné dans les commentaires, requêtes paramétrées sont généralement une meilleure pratique de s'échapper de chaque élément d'entrée manuellement. PHP AOP extension est un bon endroit pour commencer avec cette approche.
Je suis d'accord, un paramétrage est mieux que de s'échapper + concaténation comme une pratique de codage, car il est plus difficile de faire des erreurs. Je vais modifier une référence dans la réponse.
OriginalL'auteur David Sherron
La dernière partie
-- '
est commentaire, si MySQL n'a pas de soins. Donc, nous n'avons pas de gaucheDans cette requête
1=1
est vrai, parce que 1 est le même est de 1. Il pourrait être ici, bien sûr, un autre vrai expressions comme par exemple2=2
ou'a'='a'
- le résultat sera toujours le même.Afin que votre requête pourrait ressembler à ceci:
Opérateur
OR
fonctionne de cette façon que si l'une des conditions est vraie, elle signifie que l'ensemble de l'expression est vraie. Dans l'expressionname = 'admin' OR true
une expression est vraie (true est vrai) donc, toute cette expressions esttrue
Ainsi la requête pouvait être
Maintenant, si nous regardons d'OÙ nous avons
WHERE true
. Cela signifie, de facto, il n'y a pas de condition, de sorte que nous pouvons changer la requête:Donc, comme vous voyez votre requête get simple colonne
password
pour chacun des enregistrements dans une table (probablement pour tous les utilisateurs)SELECT name FROM list WHERE name = true -- '
si vous avez un problème, s'il vous plaît expliquer ce qui se passe (erreur? rien? crash? etc.). Dans ce cas, il est probable que vous comparez une colonne de type chaîne avec une constante booléenne.
Merci beaucoup MR @Marrcin, excusez-moi, pourriez-vous m'aider pourquoi, après requête a retourné un résultat vide définir?
SELECT name FROM list WHERE name = true -- '
Regarder les manuel: En SQL, tous les opérateurs logiques sont évaluées à TRUE, FALSE ou NULL (INCONNU). Dans MySQL, ceux-ci sont mis en œuvre comme 1 (VRAI), 0 (FAUX), et la valeur NULL. Si vous avez la même que
SELECT name FROM list WHERE name = 1
personne N'a ce nom, donc pas de résultat.ce serait un résultat attendu. Vous n'avez pas les lignes où la colonne est égale à la valeur booléenne true, puisque c'est une chaîne. Le
--'
à la fin ne fait rien dans ce cas - la dans votre post original, il a pour effet de cacher le reste de l'auteur original de la requête, mais qui ne s'applique pas ici.OriginalL'auteur Marcin Nabiałek
Je pense que vous êtes la recherche pour " ET "au lieu de "OU"
"OU" signifie que l'une des conditions (where name = 'admin' or 1=1) doit être vrai, et dans ce cas, il est de retour tout ce qui a nom est égal à "admin", ou qui a 1 égal à 1.
Essayez d'utiliser ceci à la place:
OR
forme est ce que le pirate aurait voulu.Ah ok, désolé, je suis nouveau à ce genre de choses, juste essayé de l'aider, de le peu que je sais. Merci de me le dire.
Pas de soucis. Vous auriez raison si la
1=1
précédé le reste de laWHERE
clause - avoir un permanent de la clause avec un certain nombre d'option est populaire pour le générateur de requêtes de bibliothèques. C'est parce qu'il simplifie la syntaxe supplémentaire - toutes les nouvelles clauses de la formeAND (clause)
.OriginalL'auteur Duane