2016-08-07 2 views
-1

L'exemple ci-dessous provient de sqli-lab. Dans le document de MySQL (comment), le "-" (double tiret suivi d'au moins un espace) signifie le commentaire d'une ligne. Cela fonctionne dans certaines situations.Dans ce cas, pourquoi '- +' le style de commentaire de mysql peut-il fonctionner?

Ma question est comment cela fonctionne dans l'exemple ici, pourquoi il peut lister tous les enregistrements de la table 'users'. Pouvez-vous donner quelques idées sur son mécanisme? THX!

mysql> select username, password from users where username = '' --+ ''; 
+----------+------------+ 
| username | password | 
+----------+------------+ 
| Dumb  | Dumb  | 
| Angelina | I-kill-you | 
| Dummy | [email protected] | 
| secure | crappy  | 
| stupid | stupidity | 
| superman | genious | 
| batman | mob!le  | 
| admin | admin  | 
| admin1 | admin1  | 
| admin2 | admin2  | 
| admin3 | admin3  | 
| dhakkan | dumbo  | 
| admin4 | admin4  | 
+----------+------------+ 
+0

"Il fonctionne dans une situation réellement" Pouvez-vous clarifier cela? Où cela ne fonctionne-t-il pas, quand cela ne fonctionne-t-il pas? – FrankerZ

+0

@FrankerZ est vraiment clair si vous essayez .. - + retourner toutes les lignes .. (semble un comportement étrange) mais - + n'est pas une séquence de commentaires – scaisEdge

+0

J'ai posté une explication possible de votre question – scaisEdge

Répondre

0

En fait @scaisEdge est bon, le « - + » dans MySQL (la cmdline interactive) n'est pas un commentaire, cet usage est généralement utilisé pour urlencodage (un espace dans une partie de la requête peut être codé pour « + 'ou'% 20 ').

Dans ce cas, '- +' est juste 2 types d'opérateurs: plus & moins, et un - et un + offset. Donc, cette séquence est égale à:

select username, password from users where username = '' - ''; 

Original: 
mysql> select username, password from users where username = '' --+ ''; 
+----------+------------+ 
| username | password | 
+----------+------------+ 
| Dumb  | Dumb  | 
| Angelina | I-kill-you | 
| Dummy | [email protected] | 
| secure | crappy  | 
... 

Now: 
mysql> select username, password from users where username = '' - ''; 
+----------+------------+ 
| username | password | 
+----------+------------+ 
| Dumb  | Dumb  | 
| Angelina | I-kill-you | 
| Dummy | [email protected] | 
| secure | crappy  | 
... 

Vous pouvez voir que les résultats sont identiques.

En second lieu, '' égale ENTIER 0 ici. MySQL, un champ sans un entier valide correspondra à 0.

mysql> select '' = 0; 
+--------+ 
| '' = 0 | 
+--------+ 
|  1 | 
+--------+ 

mysql> select '0s28' = 0; 
+------------+ 
| '0s28' = 0 | 
+------------+ 
|   1 | 
+------------+ 

mysql> select '8s28' = 0; 
+------------+ 
| '8s28' = 0 | 
+------------+ 
|   0 | 
+------------+ 

mysql> select '8s28' = 8; 
+------------+ 
| '8s28' = 8 | 
+------------+ 
|   1 | 
+------------+ 

====Type Conversion==== 

mysql> select '12s' + 3; 
+-----------+ 
| '12s' + 3 | 
+-----------+ 
|  15 | 
+-----------+ 

mysql> select 's52s6' + 3; 
+-------------+ 
| 's52s6' + 3 | 
+-------------+ 
|   3 | 
+-------------+ 

mysql> select 's8' + 3; 
+----------+ 
| 's8' + 3 | 
+----------+ 
|  3 | 
+----------+ 

Alors '' - '' signifie 0 - 0 est encore .

Alors que la colonne ne USERNAME n'a pas un nom qui commence par un caractère numérique valide (pas 0), de sorte que tous le nom égal à 0 et correspond à la conditon « où le nom d'utilisateur = 0 »

mysql> select 'Dumb' = 0; 
+------------+ 
| 'Dumb' = 0 | 
+------------+ 
|   1 | 
+------------+ 

Pour vérifier cette conclusion, nous pouvons insérer dans un enregistrement que nom d'utilisateur commence par un entier comme '4love'. Vous verrez tous les enregistrements sont répertoriés sauf le nouveau.

Une question similaire est ici: mySQL returns all rows when field=0