Ich möchte meine Anmeldeskripte für Kundenwebsites neu schreiben, um sie sicherer zu machen. Ich möchte wissen, welche Best Practices ich in diese implementieren kann. Passwortgeschützte Control Panels sind in Hülle und Fülle vorhanden, aber nur sehr wenige scheinen Best Practices in Bezug auf das Schreiben von Code, die Geschwindigkeit und die Sicherheit zu implementieren.
Ich werde PHP und eine MySQL-Datenbank verwenden.
Früher habe ich md5 verwendet, aber ich sehe, dass sha256 oder sha512 besser wären (zusammen mit sicherem Hash und Salz).
Einige Anmeldeskripte protokollieren die IP-Adresse während der Sitzung oder sogar den Benutzeragenten, aber ich möchte dies vermeiden, da sie nicht mit Proxyservern kompatibel sind.
Ich bin auch ein wenig hinter den Best Practices bei der Verwendung von Sitzungen in PHP 5 zurückgeblieben (das letzte Mal, als ich gelesen habe, war PHP 4), daher wären einige Best Practices für diese hilfreich.
Vielen Dank.
quelle
Antworten:
Der beste Gedanke ist, das Rad nicht neu zu erfinden. Ich verstehe jedoch, dass es in der PHP-Welt schwierig sein kann, eine qualitativ hochwertige Komponente zu finden, die dies bereits tut (auch wenn ich mir ziemlich sicher bin, dass die Frameworks solche Dinge implementieren und ihre Implementierungen bereits getestet, solide, codeüberprüft usw. sind. )
Wenn Sie aus bestimmten Gründen kein Framework verwenden können, finden Sie hier einige Vorschläge:
Sicherheitsrelevante Vorschläge
Verwenden Sie PBKDF2 oder Bcrypt, wenn Sie können . Dafür ist es getan.
Begründung: Beide Algorithmen können den Hashing-Prozess beliebig langsam machen. Genau das möchten Sie beim Hashing von Passwörtern (schnellere Alternativen bedeuten einfachere Brute Force). Im Idealfall sollten Sie die Parameter so anpassen, dass der Prozess auf derselben Hardware mit der Zeit immer langsamer wird, während neue, schnellere Hardware freigegeben wird.
Wenn dies nicht möglich ist, verwenden Sie mindestens MD5 / SHA1 nicht. Noch nie. Vergiss es . Verwenden Sie stattdessen beispielsweise SHA512. Verwenden Sie auch Salz.
Begründung: MD5 und SHA1 sind zu schnell. Wenn der Angreifer Zugriff auf Ihre Datenbank hat, die die Hashes enthält, und über einen (nicht einmal besonders leistungsstarken) Computer verfügt, ist es schnell und einfach, ein Passwort zu erzwingen. Wenn keine Salze vorhanden sind, erhöht sich die Wahrscheinlichkeit, dass der Angreifer das tatsächliche Kennwort findet (was zusätzlichen Schaden verursachen kann, wenn das Kennwort an einer anderen Stelle erneut verwendet wird).
Verwenden Sie in PHP 5.5.0 und höher
password_hash
undpassword_verify
.Begründung: Das Aufrufen einer vom Framework bereitgestellten Funktion ist einfach, sodass das Risiko eines Fehlers verringert wird. Bei diesen beiden Funktionen müssen Sie nicht an verschiedene Parameter wie den Hash denken. Die erste Funktion gibt eine einzelne Zeichenfolge zurück, die dann in der Datenbank gespeichert werden kann. Die zweite Funktion verwendet diese Zeichenfolge zur Kennwortüberprüfung.
Schützen Sie sich vor Gewalt . Wenn der Benutzer ein falsches Kennwort eingibt, obwohl er vor 0,01 Sekunden bereits ein anderes falsches Kennwort eingegeben hat, ist dies ein guter Grund, das Kennwort zu blockieren. Während die Menschen schnell eingeben können, können sie wahrscheinlich nicht sein , dass schnell.
Ein weiterer Schutz wäre die Festlegung einer stündlichen Ausfallgrenze. Wenn der Benutzer in einer Stunde 3600 falsche Kennwörter eingegeben hat, 1 Kennwort pro Sekunde, ist es schwer zu glauben, dass dies ein legitimer Benutzer ist.
Begründung: Wenn Ihre Passwörter unsicher gehasht werden, kann Brute Force sehr effektiv sein. Wenn Kennwörter sicher gespeichert werden, verschwendet Brute Force immer noch die Ressourcen und die Netzwerkbandbreite Ihres Servers und führt zu einer geringeren Leistung für legitime Benutzer. Die Brute-Force-Erkennung ist nicht einfach zu entwickeln und in Ordnung zu bringen, aber für jedes kleine System lohnt es sich auf jeden Fall.
Bitten Sie Ihre Benutzer nicht, ihre Passwörter alle vier Wochen zu ändern. Dies ist äußerst ärgerlich und verringert die Sicherheit, da die Post-It-Sicherheit gefördert wird.
Begründung: Die Idee, dass das System durch das Erzwingen eines Kennwortwechsels alle n Wochen vor brutaler Gewalt geschützt wird, ist falsch. Brute-Force-Angriffe sind in der Regel innerhalb von Sekunden, Minuten, Stunden oder Tagen erfolgreich, sodass monatliche Kennwortänderungen keine Rolle mehr spielen. Andererseits sind Benutzer schlecht darin, sich Kennwörter zu merken. Wenn sie diese ändern müssen, versuchen sie entweder, sehr einfache Passwörter zu verwenden, oder notieren sich ihre Passwörter einfach auf den Post-its.
Prüfe alles, jedes Mal. Speichern Sie Anmeldungen, aber niemals Kennwörter im Überwachungsprotokoll. Stellen Sie sicher, dass das Überwachungsprotokoll nicht geändert werden kann (dh Sie können am Ende Daten hinzufügen, die vorhandenen Daten jedoch nicht ändern). Stellen Sie sicher, dass die Überwachungsprotokolle regelmäßig gesichert werden. Im Idealfall sollten Protokolle auf einem dedizierten Server mit sehr restriktiven Zugriffen gespeichert werden: Wenn ein anderer Server gehackt wird, kann der Angreifer die Protokolle nicht löschen, um seine Anwesenheit (und den Pfad, der während des Angriffs verwendet wurde) zu verbergen.
Erinnern Sie sich nicht an die Benutzeranmeldeinformationen in Cookies, es sei denn, der Benutzer fragt danach (das Kontrollkästchen "Erinnere dich an mich" muss standardmäßig deaktiviert sein, um menschliches Versagen zu vermeiden).
Benutzerfreundlichkeit Vorschläge
<span/>
. Browser können in diesem Fall das Kennwortfeld nicht ausfüllen (zumindest Firefox kann dies nicht), sodass eine Abmeldung und eine Anmeldung mit einem normalen Formular erforderlich sind, das vom Browser ausgefüllt wird.quelle
bcrypt
wird von hochqualifizierten Leuten gemacht. Es wurde auch getestet, überprüft usw. Es gibt also keinen Grund, dasselbe selbst zu implementieren. Es ist wie das Erstellen eines eigenen Kryptografiealgorithmus für Ihre Website. * "Warum nicht md5 / sha1?": Siehe zum Beispiel en.wikipedia.org/wiki/MD5#Securitybcrypt
wenn möglich. Verwenden Sie andernfalls eine andere Art von iteriertem Hash.mysql_real_escape_string
. Verwenden Sie niemals Zeichenfolgenverkettung, um Ihre Abfrage zu erstellen. Verwenden Sie vorbereitete, parametrisierte Abfragen. Die meisten, wenn nicht alle DB-Treiber für PHP unterstützen dies. Wenn Sie nicht wissen , wie es zu tun, einige Zeit Lernen verbringen , wie manprepare
,bind
undexecute
verwenden Sie das DB Sie verwenden. Es ist die einzige sichere Möglichkeit , sich gegen SQL - Injection zu schützen. PDO unterstützt dies.quelle
mysql_real_escape_string
ist falsche Sicherheit - es ist keine Garantie. Parametrisierte Abfragen sind.Verwenden Sie einen gesalzenen One-Way-Hash (vorzugsweise SHA512 unter http://au2.php.net/manual/en/function.hash.php ) ... auf diese Weise, wenn jemand Ihre Datenbank hackt, auch wenn er das Salt kennt können sie die Passwörter nicht extrahieren (ohne eine Regenbogentabelle, die für SHA512 lang wäre).
Verwenden Sie HTTPS.
Senden Sie dem Benutzer bei der Registrierung keine Benutzernamen- / Passwortbestätigungen per E-Mail zurück.
Wenn Sie Cookies für "Erinnere dich an mich" zulassen, fügen Sie ein zusätzliches Login hinzu, um auf die Administrations- und Profilbearbeitungsfunktionen zuzugreifen.
Wenn ein Benutzer ein falsches Passwort erhält, sagen Sie nicht, dass er das falsche Passwort erhalten hat (sagen Sie, dass er den Benutzernamen oder das falsche Passwort immer erhalten hat) - auf diese Weise erhalten Sie weniger Hinweise darauf, welche Benutzernamen gültig sind.
Versuchen Sie, den Benutzernamen gegenüber der Anmeldung zu implementieren. Auf diese Weise werden weniger Benutzer ihren Anmeldenamen in Benutzerlisten anzeigen.
quelle
quelle
Ein Tipp: Stellen Sie sicher, dass auf Ihre Cookies nicht mit JS zugegriffen werden kann, um Diebstahl zu verhindern. Weitere Informationen finden Sie unter Schutz Ihrer Cookies: Nur HTTP- Artikel von Jeff Atwood
quelle