2009-04-23 18 views
2

Okay, ich habe zwei Variablen in PHPWas ist falsch mit dieser SQL-Abfrage?

$username; 
$password; 

, die auf die Daten von $ _POST Variable :)

Ich habe diese SQL-Abfrage

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')"; 

abgerufen initialisiert werden, aber dies wird nicht funktioniert und gibt mir nichts zurück :(

Können Sie mich in die richtige Richtung anweisen. Bitte?

+8

Bitte beachten Sie, dass dies sql Injektion einladen würde. –

Antwort

12

Die Abfrage eine schließende Klammer für nicht am Ende Grund, es wird nicht funktionieren.

+0

Das habe ich nicht gesehen. War immer noch schockiert, ein solches Sicherheitsrisiko zu sehen. Dies ist jedoch wahrscheinlich die beste Antwort. Das Entfernen der Klammern sollte den Code funktionieren lassen, aber * bitte * nicht in der Produktion verwenden. –

7

Was ist falsch daran?

Alles, leider. Insbesondere ist es offen für SQL-Injection-Angriffe.

Wenn das ein wörtlicher Schnitt & Paste ist, dann ist der Grund, warum es nicht wirklich funktioniert, eine abschließende schließende Klammer. Vermutlich werden Sie nicht nach Fehlern suchen, wenn Sie das anrufen?

Mit dem MySQL-API soll es sein:

$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?"); 
$sth->execute($username, $password); 
list($count) = $sth->fetchrow(); 
$authorized = ($count > 0); 

oder ähnlich (Code ungetestet, E & OE, etc ...)

2

Warum gibt es eine streunende) am Ende Ihrer Abfrage? Es sollte nicht da sein.

Oh, und thirded auf SQL-Injektion. SCHLECHT.

1

Sie scheinen am Ende der Abfragezeichenfolge eine schließende runde Klammer zu haben.

[Bearbeiten] - für diejenigen, die SQL-Injection-Angriffe schreien: Wir wissen nicht, was der Benutzer mit ihren Variablen gemacht hat, bevor sie sie in der Abfrage verwenden. Wie wäre es mit dem Vorteil des Zweifels? ;-)

+0

Sicher als Entschuldigung, etc. –

+0

Besser, ihm zu sagen und zu finden, dass er schon darüber nachgedacht hat, als ihm * nicht * zu sagen, falls er es nicht getan hat. –

+0

Sie sollten die Daten immer bereinigen, während sie an die Datenbank übergeben werden, zusätzlich zur Validierung von Eingaben. – Matt

1

Zuerst einmal nie, überhaupt tun es so. Bitte lesen Sie über SQL injection und schreiben Sie kein SQL, bis Sie verstanden haben, was es sagt. Entschuldigung, aber das ist wirklich wichtig.

Das heißt, Ihre Abfrage enthält eine schließende Klammer. Das sieht wie ein Syntaxfehler aus. Wird bei der Ausführung ein Fehler angezeigt?

1

Auf der rechten Seite der Abfrage befindet sich eine zusätzliche Klammer.

Wenn Sie Ihren Code nicht ordnungsgemäß bereinigen, sind Sie anfällig für SQL-Injection. Sie sollten wirklich parametrisierte Abfragen verwenden, aber stattdessen mindestens mysql_real_escape_string() auf $username und $password verwenden.

Auch als ein bisschen Ghost-Debugging ist es sehr wahrscheinlich, dass Ihre Passwörter MD5-Hash in der Datenbank sind, da Sie sie nie im Klartext speichern sollten.

Versuchen:

$username = mysql_real_escape_string($_POST["username"]); 
$password = md5($_POST["password"]); 

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
+0

MySQL hat seine eigene perfekt gute MD5() Funktion ... – Alnitak

+1

Ich erinnere mich nicht daran, es automatisch anwendet –

0

Zusätzlich zu all den anderen Problemen zur Kenntnis genommen. Das Passwort in der Tabelle Benutzer wird verschlüsselt gespeichert. Sofern Sie das Passwort nicht über den MySQL-Passwortverschlüsseler laufen haben, werden Sie niemals Daten von dieser Abfrage sehen, da die Passwörter nicht übereinstimmen.

+0

Wie können Sie davon ausgehen, zu wissen, wie das Passwort gespeichert ist in seinem Datenbankschema? –

Verwandte Themen