Wie ich sehe, speichern Sie einen Hash des Passworts in der Datenbank, aber niemals zugunsten anderer Leser Passwörter im Klartext in der Datenbank speichern. Sie wollen kein wie Monster.com.uk !
Sie sollten eine stärkere Hash-Funktion als MD5()
verwenden . Idealerweise sollten Sie SHA256 verwenden. Diese Hash-Methode ist in PHP mit hash()
verfügbar
Funktion.
Sie sollten auch ein zufälliges Salt anwenden zum Passwort. Speichern Sie für jedes Benutzerkonto einen anderen Salt-Wert. Dies hilft, Wörterbuchangriffe und Regenbogentabellen abzuwehren Angriffe.
Sie sollten lernen, den mysqli zu verwenden Erweiterung anstelle der alten mysql-Erweiterung. Mysqli unterstützt parametrisierte Abfragen, sodass Sie die Anfälligkeit für einige SQL-Injection-Angriffe reduzieren können.
Hier ist ein Beispielcode. Ich habe es nicht getestet, aber es sollte ziemlich gut funktionieren:
$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;
Einige andere Leute schlagen vor, dass die Abfrage auf login = ? AND password = ?
aber das mache ich nicht gerne. Wenn Sie dies tun, können Sie nicht wissen, ob die Suche fehlgeschlagen ist, weil die Anmeldung nicht existierte oder weil der Benutzer ein falsches Passwort angegeben hat.
Natürlich sollten Sie nicht den Benutzer verraten, der den fehlgeschlagenen Anmeldeversuch verursacht hat, sondern Sie möglicherweise wissen müssen, damit Sie verdächtige Aktivitäten protokollieren können.
@Javier sagt in seiner Antwort, dass Sie das Passwort (oder in diesem Fall den Passwort-Hash) nicht aus der Datenbank abrufen sollten. Ich bin nicht einverstanden.
Javier zeigt den Aufruf von md5()
in PHP-Code und sendet den resultierenden Hash-String an die Datenbank. Dies unterstützt jedoch nicht das einfache Salten des Passworts. Sie müssen eine separate Abfrage durchführen, um das Salt dieses Benutzers abzurufen, bevor Sie den Hash in PHP ausführen können.
Die Alternative ist das Senden des Klartextes Passwort über das Netzwerk von Ihrer PHP-App zu Ihrem Datenbankserver. Jeder, der Ihr Netzwerk abhört, kann dieses Passwort sehen. Wenn SQL-Abfragen protokolliert werden, kann jeder, der Zugriff auf die Protokolle erhält, das Kennwort sehen. Motivierte Hacker können sogar nach alten Dateisystem-Sicherungsmedien suchen und auf diese Weise die Protokolldateien lesen!
Das geringere Risiko besteht darin, den Passwort-Hash-String aus der Datenbank in die PHP-App zu holen, ihn mit dem Hash der Benutzereingabe (ebenfalls im PHP-Code) zu vergleichen und diese Variablen dann zu verwerfen.