php - zurücksetzen - wordpress passwort ändern




Löschung von Benutzerpasswörtern (2)

Wie kann ich von Benutzern bereitgestellte Passwörter entziehen oder bereinigen, bevor ich sie hashe und in meiner Datenbank speichere?

Wenn PHP-Entwickler aus Sicherheitsgründen das Hashing von Benutzerpasswörtern in Betracht ziehen, neigen sie häufig dazu, sich diese Passwörter wie alle anderen vom Benutzer bereitgestellten Daten vorzustellen. Dieses Thema taucht häufig bei PHP-Fragen zum Speichern von Passwörtern auf. Der Entwickler möchte das Kennwort häufig mithilfe von Funktionen wie escape_string() (in verschiedenen Iterationen), htmlspecialchars() , addslashes() und anderen htmlspecialchars() , bevor es htmlspecialchars() und in der Datenbank gespeichert wird.


Bevor Sie das Kennwort hashen, sollten Sie es wie in Abschnitt 4 von RFC 7613 beschrieben normalisieren. Im Speziellen:

  1. Zusätzliche Zuordnungsregel: Alle Instanzen eines Nicht-ASCII-Bereichs MÜSSEN einem ASCII-Bereich zugeordnet werden (U + 0020). Ein Nicht-ASCII-Leerzeichen ist ein beliebiger Unicode-Codepunkt mit der allgemeinen Unicode-Kategorie "Zs" (mit Ausnahme von U + 0020).

und:

  1. Normalisierungsregel: Unicode-Normalisierungsform C (NFC) MUSS auf alle Zeichen angewendet werden.

Auf diese Weise soll sichergestellt werden, dass das Kennwort weiterhin akzeptiert wird, wenn der Benutzer dasselbe Kennwort mit einer anderen Eingabemethode eingibt.


Sie sollten aus mehreren Gründen niemals einen anderen Bereinigungsmechanismus für Kennwörter verwenden, die Sie mit PHPs password_hash() haschen. Der größte Grund dafür ist, dass für eine zusätzliche Bereinigung des Kennworts unnötiger zusätzlicher Code erforderlich ist.

Sie werden argumentieren (und Sie sehen es in jedem Beitrag, in dem Benutzerdaten für die Verwendung in Ihren Systemen akzeptiert werden), dass wir alle Benutzereingaben bereinigen sollten, und Sie würden für jede andere Information, die wir von unseren Benutzern akzeptieren, Recht haben. Passwörter sind unterschiedlich. Hash-Kennwörter können keine Bedrohung durch SQL-Injection darstellen, da die Zeichenfolge vor dem Speichern in der Datenbank in Hash umgewandelt wird.

Das Hashing eines Passworts dient dazu, das Passwort sicher in Ihrer Datenbank zu speichern. Die Hash-Funktion gibt keinen Bytes eine besondere Bedeutung, sodass aus Sicherheitsgründen keine Bereinigung der Eingabe erforderlich ist

Wenn Sie den Mantras folgen, dass Benutzer die von ihnen gewünschten Passwörter / Phrasen verwenden dürfen , und Sie die Passwörter nicht einschränken , wird die Sicherheit des Passworts / der Passphrase durch das Hashing beliebiger Länge, Leerzeichen und Sonderzeichen gewährleistet, unabhängig davon, was darin enthalten ist das Passwort. Ab PASSWORD_BCRYPT verwandelt der häufigste Hash (der Standard), PASSWORD_BCRYPT , das Passwort in eine 60 Zeichen breite Zeichenfolge, die ein zufälliges Salt zusammen mit den gehashten Passwortinformationen und den Kosten (den algorithmischen Kosten für die Erstellung des Hashs) enthält:

Mit PASSWORD_BCRYPT werden mithilfe des CRYPT_BLOWFISH-Algorithmus neue Kennwort-Hashes erstellt. Dies führt immer zu einem Hash mit dem Kryptoformat "$ 2y $", das immer 60 Zeichen breit ist.

Die Speicherplatzanforderungen für das Speichern des Hashs können sich ändern, da der Funktion verschiedene Hashing-Methoden hinzugefügt werden. Daher ist es immer besser, den Spaltentyp für den gespeicherten Hash zu vergrößern, z. B. VARCHAR(255) oder TEXT .

Sie könnten eine vollständige SQL-Abfrage als Ihr Passwort verwenden und es würde gehasht, was es für die SQL-Engine nicht ausführbar macht, z.

SELECT * FROM `users`;

Könnte auf $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G

Mal sehen, wie sich verschiedene Desinfektionsmethoden auf das Passwort auswirken -

Das Passwort ist, I'm a "dessert topping" & a <floor wax>! (Am Ende des Passworts befinden sich 5 Leerzeichen, die hier nicht angezeigt werden.)

Wenn wir die folgenden Methoden zum Trimmen anwenden, erhalten wir einige sehr unterschiedliche Ergebnisse:

var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));

Ergebnisse:

string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // double quotes, ampersand and braces have been changed
string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>!     " // escape characters have been added
string(34) "I'm a "dessert topping" & a !     " // looks like we have something missing

Was passiert, wenn wir diese an password_hash() senden? Sie werden alle gehasht, genau wie die obige Abfrage. Das Problem tritt auf, wenn Sie versuchen, das Kennwort zu überprüfen. Wenn wir eine oder mehrere dieser Methoden anwenden, müssen wir sie erneut anwenden, bevor wir sie mit password_verify() . Folgendes würde fehlschlagen:

password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query

Sie müssten das übermittelte Kennwort mit der von Ihnen ausgewählten Bereinigungsmethode ausführen, bevor Sie das Ergebnis der Kennwortüberprüfung verwenden können. Es ist eine unnötige Reihe von Schritten und wird den Hash nicht besser machen.

Verwenden Sie eine PHP-Version unter 5.5? Sie können das Kompatibilitätspaket password_hash() .

Sie sollten wirklich keine MD5-Passwort-Hashes verwenden .





hash