Frage

Lassen Sie uns sagen, dass ich eine SQL-Anweisung wie diese haben, die eine Benutzeranmeldung prüft:

SELECT * FROM users 
WHERE username='test@example.com', password='abc123', expire_date>=NOW();

Gibt es eine Möglichkeit in SQL speziell zu bestimmen, welche WHERE-Bedingungen fehlschlagen, ohne jede Bedingung in seine eigenen Abfrage und Prüfung einzeln zu trennen?

In diesem speziellen Beispiel würde es dem Entwickler erlauben Benutzern zu sagen, genau der Grund, warum ihr Versuch gescheitert einzuloggen.

Für meine Zwecke verwende ich PHP / MySQL.

War es hilfreich?

Lösung 5

Hier ist, was ich kam mit:

SELECT
  IF(mem_username='test@example.com','true','Error: Bad Username') AS mem_username,
  IF(mem_password ='abc123','true','Error: Bad Password') AS mem_password'
FROM MEMBERS
WHERE mem_username='test@example.com' AND mem_password='abc123'

So kann ich in Code für Fehlermeldungen erkennen kann, und zeigt sie dann nach Bedarf.

Hinweis: Um euch alle Sicherheitsbedenken mit dem Beispielcode unter Berufung auf, wir danken Ihnen für Ihr Interesse. Dies ist jedoch nicht die reale Produktion Code dies war nur ein einfaches Beispiel die Frage, die ich hatte zu demonstrieren. Es ist ganz offensichtlich, dass Sie keine Passwörter im Klartext gespeichert werden sollen, und dass Sie sollten nicht geben Benutzern Besonderheiten auf, warum Anmeldung nicht möglich.

Andere Tipps

Nun, eine Sache, die Sie tun können, ist Ihre Abfrage ändern, so dass es nur auf den Benutzernamen übereinstimmt. Dann im Code Sie das Passwort überprüfen und das Ablaufdatum, entsprechende Fehler zurück.

Auch ich hoffe, dass Ihr Beispiel Abfrage eine Vereinfachung ist; Sicherlich sollten Sie werden Pökeln / Verschlüsselung / Ihre Passwörter Hashing, und Sie sollten etwas enthalten, die die Anzahl von Fehlversuchen innerhalb eines bestimmten Zeitraums begrenzt, etc ...

Soweit Ihre eigentliche Frage (im Gegensatz zu den Ergebnissen im Gegensatz Sie suchen), gibt es keine Möglichkeit, dass die Informationen aus der Where-Klausel zu erhalten. Die nächstgelegene Sie tun könnten, wäre so etwas wie:

SELECT *,
    CASE WHEN Password = 'asdf' THEN 1 ELSE 0 END AS IsPasswordMatch,
    CASE WHEN Expiration >= NOW() THEN 1 ELSE 0 END AS IsActiveAccount
FROM Users
WHERE Username = 'user'

In MySQL können Sie Boolesche Ausdrücke in der Select-Liste setzen. Boolesche Ausdrücke auswerten, um die ganze Zahl 1, wenn wahr ist, oder die ganze Zahl 0, wenn falsch.

SELECT password = 'abc123' AS is_authenticated,
       expire_date >= NOW() AS is_not_expired
FROM users
WHERE username='test@example.com';

Hinweis: Wenn Sie eine Abfrage schreiben müssen, die auf anderen Marken von RDBMS funktioniert, halten diese Verwendung von Booleschen Ausdrücken im Auge Nicht-Standard ist. Verwenden Sie die CASE Syntax, die andere Leute geschrieben haben.

PS: Dies ist eine Tangente von Ihrer Frage, aber ich fordere Sie Passwörter in Klartext speichern nicht. Bewahren Sie einen Hash-Digest des gesalzenen Passwort. Siehe Wie funktioniert Passwort Salz Hilfe gegen einen Regenbogen Tabelle Angriff?

Nein, die where-Klausel als Block angewandt und verschiedene Techniken eingesetzt werden, so dass nicht alle Zeilen abgetastet werden müssen. Auch, wie würden Sie wissen, welche Zeile war diejenige, die gewünscht wurde?

Darüber hinaus möchten Sie wahrscheinlich den Benutzer nicht zu viel darüber sagen, warum ein Anmeldeversuch fehlgeschlagen. Zu sagen, zu viel erlaubt Exploits wie Konto Bergbau und Passwort-Attacken.

Bearbeiten Wenn Sie wirklich diese zu Ihrem Benutzer angezeigt werden möchten, dann teilen Sie Ihre Logik in verschiedene Teile:

  1. Bestätigen Identität
    Aktion: Holt die entsprechenden Benutzer Zeile aus der Datenbank
    Ergebnis:
    • Wenn keine solche Zeile vorhanden => ungültig Konto
    • Wenn Zeile zurückgegeben wird, fahren Sie mit Schritt 2 fort.
  2. Validate Credential
    Aktion: Überprüfen Sie die gespeicherten Anmeldeinformationen (Passwort, Hash-Passwort oder verschlüsselte Passwort) gegen das Passwort in der gleichen Weise behandelt geliefert der Berechtigungsnachweis gespeichert wird.
    Ergebnis:
    • No match => Ungültige Passwort / Credential
    • Match => Erfolgreicher Anmeldeversuch
  3. Login Benutzer
    Aktion:. Eingabe von Daten in Sitzung usw.

Sie müssen wahrscheinlich nur die Teile der Where-Klausel trennen mit ‚AND‘

SELECT * FROM users 
WHERE username='test@example.com'
   And password='abc123'
   And expire_date>=NOW();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top