Wie ich sehe, speichern Sie einen Hash des Kennworts in der Datenbank, aber nur zum Nutzen anderer Leser, niemals Passwörter im Klartext in der Datenbank speichern. Sie wollen nicht, dass wie Monster.com.uk !
Sie sollten eine stärkere Hash-Funktion verwenden als MD5()
. Idealerweise sollten Sie SHA256 verwenden. Diese Hash-Methode ist in PHP mit dem Befehl hash()
Funktion.
Sie sollten auch eine zufällige Salz zum Passwort. Speichern Sie für jedes Benutzerkonto einen anderen Salt-Wert. Dies hilft bei der Abwehr von Wörterbuchangriffen und Regenbogentisch Angriffe.
Sie sollten lernen, die mysqli Erweiterung anstelle der alten mysql-Erweiterung. Mysqli unterstützt parametrisierte Abfragen, so dass Sie die Anfälligkeit für einige SQL-Injection-Angriffe verringern können.
Hier ist ein Beispielcode. Ich habe es nicht getestet, aber es sollte ziemlich nahe an der Arbeit sein:
$input_login = $_POST['login'];
$input_password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);
while ($stmt->fetch()) {
$input_password_hash = hash('sha256', $input_password . $salt);
if ($input_password_hash == $password_hash) {
return true;
}
// You may want to log failed password attempts here,
// for security auditing or to lock an account with
// too many attempts within a short time.
}
$stmt->close();
// No rows matched $input_login, or else password did not match
return false;
Andere Leute schlagen vor, die Abfrage sollte auf login = ? AND password = ?
aber das tue ich nicht gerne. Wenn Sie dies tun, können Sie nicht wissen, ob die Suche fehlgeschlagen ist, weil die Anmeldung nicht existiert oder weil der Benutzer ein falsches Passwort angegeben hat.
Natürlich sollten Sie dem Benutzer nicht verraten, wodurch der fehlgeschlagene Anmeldeversuch verursacht wurde, aber Sie wissen müssen, damit Sie verdächtige Aktivitäten protokollieren können.
@Javier sagt in seiner Antwort, dass Sie das Kennwort (oder den Kennwort-Hash in diesem Fall) nicht aus der Datenbank abrufen sollten. Dem stimme ich nicht zu.
Javier ruft an md5()
in PHP-Code und sendet die daraus resultierende Hash-Zeichenkette an die Datenbank. Dies unterstützt jedoch nicht das einfache Salzen des Passworts. Sie müssen eine separate Abfrage durchführen, um den Salt dieses Benutzers abzurufen, bevor Sie den Hash in PHP durchführen können.
Die Alternative ist das Senden der Klartext Passwort über das Netzwerk von Ihrer PHP-Anwendung zu Ihrem Datenbankserver. Jeder, der Ihr Netzwerk abhört, kann dieses Passwort sehen. Wenn Sie SQL-Abfragen protokollieren lassen, kann jeder, der Zugang zu den Protokollen erhält, das Kennwort sehen. Motivierte Hacker können sogar nach alten Dateisystem-Backup-Medien tauchen und auf diese Weise die Protokolldateien lesen!
Das geringere Risiko besteht darin, die Hash-Zeichenkette des Kennworts aus der Datenbank in die PHP-Anwendung zu holen, sie mit dem Hash-Wert der Benutzereingabe zu vergleichen (ebenfalls im PHP-Code) und diese Variablen dann zu verwerfen.
3 Stimmen
Wir hier bei stackoverflow beantworten keine Fragen zu Logins. Wir ziehen es vor, in großen technischen Details zu erklären, wie man Benutzereingaben säubert. Es ist besser, sicher zu sein, als eine funktionierende Website zu haben.
5 Stimmen
@Grant: Du machst Witze, oder?
0 Stimmen
Bitte beachten Sie, dass die Antworten auf dieser Seite veraltet und daher unsicher sind. Frage stattdessen.