2016-08-07 33 views
-1

Das folgende Beispiel stammt von sqli-lab. Im MySQL-Dokument (comment) bedeutet "-" (Doppelstrich gefolgt von mindestens einem Leerzeichen) den Kommentar einer Zeile. Es funktioniert tatsächlich in einer bestimmten Situation.In diesem Fall, warum '- +' der Kommentar Stil von MySQL kann funktionieren?

Meine Frage ist, wie es im Beispiel hier funktioniert, warum es alle Datensätze der 'Benutzer' Tabelle auflisten kann. Können Sie etwas über seinen Mechanismus erzählen? Danke!

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

"Es funktioniert in einigen Situation tatsächlich" Kannst du das klären? Wo funktioniert das nicht, wann funktioniert es nicht? – FrankerZ

+0

@FrankerZ ist wirklich klar, wenn Sie versuchen .. - + alle Zeilen zurück .. (scheint ein seltsames Verhalten), aber - + ist keine Kommentarfolge – scaisEdge

+0

Ich habe eine mögliche Erklärung Ihrer Frage geschrieben – scaisEdge

Antwort

0

Eigentlich @scaisEdge richtig ist, die ‚- +‘ in MySQL (interactive cmdline) ist kein Kommentar, ist diese Nutzung in der Regel für urlencoding (einen Raum in einem Abfrageteil verwendet wird, kann codiert werden ‚+ 'oder'% 20 ').

In diesem Fall ist "- +" nur zwei Arten von Operatoren: plus & minus, und ein - und ein + Offset. Also ist diese Sequenz gleich:

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  | 
... 

Sie können sehen, die Ergebnisse sind die gleichen.

Zweitens, '' gleich INTEGER 0 hier. In MySQL, alle Felder ohne gültige ganze Zahl wird gleichzusetzen 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 | 
+----------+ 

So '' - '' bedeutet 0 - 0 noch ist.

Während die Spalt NUTZERNAME nicht hat nicht nur einen Namen, der mit einem gültigen numerischen Zeichen beginnt (nicht 0), so dass alle die Namen gleich 0 und entspricht den conditon ‚wo username = 0

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

Um diese Schlussfolgerung zu überprüfen, können wir in einen Datensatz einfügen, dass der Benutzername mit einer Ganzzahl wie '4love' beginnt. Sie werden sehen, dass alle Datensätze außer dem neuen aufgelistet sind.

Eine ähnliche Frage ist hier: mySQL returns all rows when field=0