Wie erzeugt man ein zufälliges Passwort oder eine temporäre URL, um das Passwort in Zend Framework zurückzusetzen?

7

Ich habe einen grundlegenden Authentifizierungsprozess, der Zend_Auth_Adapter_DbTable verwendet. Ich habe An- und Abmeldeaktionen auf meinem Authentifizierungs-Controller. Jetzt möchte ich eine Funktion erstellen, um vergessene Passwörter zurückzusetzen, indem ich automatisch ein Passwort erstelle, das neue Passwort speichere und ihnen eine E-Mail mit dem neu erzeugten Passwort zusende.

Was wäre der beste Prozess, um dies zu tun? Wie sollte ich ein neues Passwort erstellen? Hat das Zend Framework etwas, das das einfacher machen würde?

Ich habe auch gehört, dass ich eine E-Mail mit einem Link zu einer Kurzzeitseite gesendet habe, auf der sie ein neues Passwort festlegen können. Wie könnte dies mit dem Zend Framework gemacht werden?

    
Andrew 16.04.2009, 05:02
quelle

1 Antwort

22

Zend Framework hat keine Passwort generierende Klasse. Hier ist ein Artikel zur Verwendung des PEAR-Moduls Text_Password , um ein Passwort zu generieren: Ссылка

Es ist jedoch keine gute Sicherheitsvorkehrung, das Passwort in einer einfachen E-Mail zu senden. Stattdessen sollten Sie ihr Konto zurücksetzen, damit sie sich vorübergehend anmelden können, ohne ein Passwort zu vergeben (vorausgesetzt, Sie erhalten eine ablaufende URL in der E-Mail). Wenn sie sich einmal angemeldet haben, müssen sie ihr eigenes Passwort auf etwas sie wissen. Speichern Sie dann den gesalzenen Hash ihres Passworts.

Hier ist ein Vorschlag aus dem Kopf für das Zend Framework:

  • Definieren Sie eine Tabelle AccountReset mit den Feldern: reset_id (GUID-Primärschlüssel), account_id (Referenz auf Accounts.account_id ) und expiration (Zeitstempel).
  • Implementieren Sie eine Aktion mit dem Namen AccountController::resetAction() , d. h. in demselben Controller, den Sie zum Erstellen von Konten, zum Anmelden, zum Ändern von Passwörtern usw. verwenden.
  • Wenn ein Benutzer sein Konto zurücksetzen möchte, fügen Sie eine neue Zeile in einer AccountReset -Tabelle mit einer neuen GUID, einem Verweis auf das Benutzerkonto und einem expiration 30 Minuten oder so in der Zukunft ein.
  • Senden Sie eine E-Mail an die für diesen Benutzer angegebene Adresse, einschließlich einer URL, auf die er klicken sollte: "https ... / account / reset / reset_id / < GUID > " (wenn Sie schlau sind mit Routing-Regeln, können Sie diese URL verkürzen, aber behalten Sie die GUID drin).
  • Wenn AccountController::resetAction() die Anforderung empfängt, sucht sie in der Tabelle reset_id nach ihrem Parameter AccountReset . Wenn diese GUID vorhanden ist und die expiration -Zeit nicht verstrichen ist, zeigen Sie dem Benutzer ein Formular zum Ändern seines Kennworts an (ohne dass er authentifiziert und angemeldet ist).
  • Wenn resetAction() eine Anfrage ohne GUID erhält oder die GUID nicht in der Datenbank vorhanden ist oder diese Zeile ihr expiration übergeben hat, kann diese Aktion stattdessen dem Benutzer eine Schaltfläche zum Initiieren eines neuen geben Anfrage zurücksetzen und eine E-Mail mit einer neuen GUID senden Denken Sie daran, diesen Button zu einer POST-Anfrage zu machen!

Da die GUID nur in einer E-Mail an die Adresse für diesen Benutzer kommuniziert wird, kann niemand sonst Zugang zum Ändern des Passworts erhalten. Selbst wenn die E-Mail des Benutzers abgefangen wird, gibt es nur eine begrenzte Zeit, bis die GUID diesen Zugriff gewährt.

Wenn Sie noch vorsichtiger sein möchten, können Sie die Client-IP-Adresse in der Tabelle AccountReset notieren und das Kennwort innerhalb dieses 30-Minuten-Fensters von einem Client mit der gleichen IP-Adresse ändern.

Dies ist nur eine Ausnahme, und ich habe es nicht implementiert oder ausgewertet, um die Sicherheit zu gewährleisten. Wenn Sie für die Implementierung der Sicherheit verantwortlich sind, ist es Ihre Pflicht, sich über Sicherheitsprobleme zu informieren. Eine gut angesehene Ressource für PHP-Sicherheit ist Ссылка .

    
Bill Karwin 16.04.2009, 05:40
quelle