53 Stimmen

PHP-Best Practices für Benutzerauthentifizierung und Passwortsicherheit

Was sind die besten aktuellen Bibliotheken/Methoden zur Authentifizierung von Benutzern ohne den Einsatz eines CMS oder eines schweren Frameworks?

Die Antworten sollten Vorschläge für alles enthalten, was Ihrer Meinung nach als Standard für neue PHP-Entwicklungen mit Benutzerauthentifizierung gelten sollte.

6voto

Patrick Allaert Punkte 1685

Anmeldung über HTTP AUTH

  1. Apache verwenden: http://httpd.apache.org/docs/2.2/howto/auth.html
  2. Es ist auch möglich mit IIS y andere Webserver .

Sobald die Authentifizierung erfolgt ist, können PHP müssen Sie nur $_SERVER['PHP_AUTH_USER'] um den bei der Authentifizierung verwendeten Benutzernamen abzurufen.

Dies kann eine schnellere und manchmal auch flexiblere Lösung sein als die Lösung auf Skriptebene, vorausgesetzt, dass nur begrenzte Informationen über den Benutzer benötigt werden, da Ihnen nur der zur Anmeldung verwendete Benutzername zur Verfügung gestellt wird.

Vergessen Sie jedoch, Ihre Authentifizierung in ein HTML-Formular zu integrieren, es sei denn, Sie implementieren ein vollständiges HTTP-AUTH-Schema innerhalb Ihrer Skriptsprache (wie unten beschrieben).

Rolling your own HTTP AUTH innerhalb Ihrer Skriptsprache

Sie können tatsächlich erweitern. HTTP Basic Auth durch Nachahmung in Ihre Skriptsprache. Die einzige Voraussetzung dafür ist, dass Ihre Skriptsprache in der Lage sein muss, HTTP-Header an den HTTP-Client zu senden. Eine ausführliche Erklärung, wie Sie dies mit PHP erreichen können, finden Sie hier: ( siehe mehr über PHP und HTTP AUTH ).

Sie können den obigen Artikel erweitern, indem Sie ein typisches Authentifizierungsschema, einen Dateispeicher, sogar PHP-Sitzungen oder Cookies (wenn die Informationen nicht beständig sein müssen) verwenden, wodurch Sie bei der Verwendung von HTTP AUTH viel flexibler sind, aber dennoch eine gewisse Einfachheit beibehalten.

Nachteile von HTTP AUTH

  1. Der größte Nachteil der HTTP-Authentifizierung sind die Komplikationen, die beim Abmelden auftreten können. Die wichtigste Möglichkeit, die Sitzung des Benutzers zu löschen, besteht darin, den Browser zu schließen oder eine Kopfzeile mit 403 Authentifizierung erforderlich zu übergeben. Leider bedeutet dies, dass das HTTP-Authentifizierungs-Popup wieder auf der Seite erscheint und der Benutzer sich dann entweder erneut anmelden oder auf Abbrechen klicken muss. Dies ist unter dem Gesichtspunkt der Benutzerfreundlichkeit nicht unbedingt sinnvoll, kann aber mit einigen interessanten Ergebnissen umgangen werden (z. B. durch die Verwendung einer Kombination aus Cookies und HTTP AUTH zur Speicherung des Status).

  2. Die Behandlung von HTTP-AUTH-Popups, Sitzungen und HTTP-Headern wird von der Browser-Implementierung des Standards bestimmt. Das bedeutet, dass Sie mit dieser Implementierung (einschließlich aller Fehler) ohne die Möglichkeit einer Umgehung feststecken (im Gegensatz zu anderen Alternativen).

  3. Basisauthentifizierung bedeutet auch, dass auth_user und Passwort in den Serverprotokollen auftauchen, und dann müssen Sie https für alles verwenden, weil sonst Benutzername und Passwort bei jeder Anfrage im Klartext über das Netzwerk gehen.

5voto

Evan Kroske Punkte 4390

Es ist wichtig, die Sicherheitsschicht Ihrer Anwendung vom Rest der Anwendung zu trennen. Wenn es keine Trennung zwischen Ihrer Anwendungslogik und Ihrem Kommunikationssystem gibt, können Sie an einer Stelle unsicher und an einer anderen sicher kommunizieren. Vielleicht machen Sie einen Fehler und senden ein Kennwort in einem unverschlüsselten Cookie, oder Sie vergessen, die Anmeldedaten des Benutzers für einen Schritt zu verifizieren. Ohne einen "richtigen Weg" für die Kommunikation mit dem Benutzer werden Sie mit Sicherheit einen Fehler machen.

Nehmen wir zum Beispiel an, dass Sie die Benutzer jetzt so verifizieren:

user_cookie = getSecureCookie()
if (user_cookie.password == session_user.password) {
    do_secure_thing()
    ...
}

Wenn eine Sicherheitslücke in getSecureCookie() entdeckt wird und Sie diesen Code verwenden, um Benutzer in Ihrer gesamten Anwendung zu überprüfen, finden Sie möglicherweise nicht alle Instanzen von getSecureCookie(), die behoben werden müssen. Wenn Sie jedoch Ihre Logik von Ihrer Sicherheit trennen:

if (userVerified()) {
    do_secure_thing()
    ...
}

... werden Sie in der Lage sein, Ihre Anwendung schnell und einfach wieder zu sichern. Geben Sie sich selbst einen "richtigen Weg" für die Sicherheit vor, und die Wahrscheinlichkeit, dass Sie einen großen Sicherheitsfehler begehen, ist viel geringer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X