Frage

Ich bin eine PHP-Website zu erstellen, die die Benutzer der Anmeldung beinhaltet, und ich frage mich, über Best Practices für die „E-Mail-Bestätigung“ Codes.

Neue Benutzer müssen ihre E-Mail-Adressen bestätigen - ich dies tun, indem ein Code zu erzeugen und sie dem Benutzer in einer E-Mail zu senden, die er dann sein Konto aktivieren verwenden können. Anstatt diese Schlüssel in einer Datenbank zu speichern, ich bin mit einer handlichen kleinen Abhilfe: Der Code ist das Ergebnis:

md5("xxxxxxxxx".$username."xxxxxxxxxxx".$timestamp."xxxxxxxxx");

Wenn $ Zeitstempel auf die Zeit vom Benutzer Schöpfung beziehen. Im Großen und Ganzen war ich ganz mit diesem zufrieden, aber dann bekam ich zu denken, das ist sicher genug? Und was ist mit der Möglichkeit von Kollisionen? Und ich muss auch Codes für Passwort-Reset erzeugen, usw. Wenn ich eine ähnliche Methode verwendet, eine Kollision in einem Benutzer versehentlich eines anderen Benutzers zurückzusetzen Passwort führen könnte. Und das ist nicht gut.

So wie tun Sie diese Dinge? Meine Gedanken waren eine Tabelle mit folgendem Format:

codePK (int, a-I), userID (int), type (int), code (varchar 32), date (timestamp)

Wo ‚Typ‘ wäre 1, 2 oder 3 bedeutet „Aktivierung“, „E-Mail-Wechsel“ oder „Passwort-Reset“. Ist das ein guter Weg, es zu tun? Haben Sie einen besseren Weg?

ein Verfahren ähnlich dem oben verwenden, könnte ich automatisch löschen etwas über zwei alten Tage ohne Cron-Jobs mit? Mein Gastgeber (nearlyfreespeech.net) nicht unterstützt. Wenn möglich würde ich auf einem externen Host, die wget einen cron-Job vermeiden möge, die ein Skript, das die Dinge löscht, so dass nur chaotisch = P.

Danke!
Mala

Update:
Zur Klarstellung: Ich habe die einzige Art und Weise realisiert werden, um sicher und sicher zu dieser Aufgabe zu gehen, ist durch die Verwendung einer Datenbank, das ist, was die ursprüngliche Funktion zu vermeiden versucht. Meine Frage ist, wie die Tabelle (oder Tabellen?) Strukturiert werden soll. Jemand schlug ich mit codePK abschaffen und nur der Code ein PK machen. Also kurz gesagt, meine Frage ist: ist es das, was Sie tun

War es hilfreich?

Lösung

Wenn ich diese Art von Tricks brauche, ist es in der Regel aus einem von zwei Gründen, die beide von Ihnen genannten:

  1. als Schlüssel für die Überprüfung von E-Mail verwendet, um den Benutzer gesendet
  2. Als Schlüssel für die Passwort-Reset-Links verwendet,

Natürlich wäre es zahlreiche andere Gelegenheiten, wo man in Betracht ziehen würden, eine solche Konstruktion verwendet wird.

Zu allererst sollte man immer eine Art von Salz verwenden, die verborgen ist, und dass Sie nur wissen. Beachten Sie, dass dieses Salz für jeden Benutzer anders sein sollte. Das Salz kann zum Beispiel als sha256(something random) berechnet werden. Dieses Salz sollte dann zusammen mit dem Benutzername und Passwort in der Datenbank gespeichert werden (mit dem Salz gehasht).

Was würde ich tun, wenn das Passwort zurückgesetzt Link zu senden ist, ein anderes Salz zu schaffen (nicht geben dem Benutzer Zugriff auf alles, was mit Ihrem Salz gehasht. Er sein Passwort kennt, so Brute-Force verwendet, könnte er möglicherweise Ihr Salz herausfinden). Das andere Salz, das im Wesentlichen nur ein Hash einer zufälligen Zeichenfolge ist (Sie md5 könnte Wanna hier gehen, wie Sie erwähnt, dass die Länge ist ein Problem), sollten Sie dann speichern in Ihre Datenbank.

Oft kann man nur erhalten mit dem Hinzufügen einer zusätzlichen Spalte an die Benutzer-Tabelle entfernt. Dies hat jedoch auch einige Probleme, vor allem, dass, sobald das Passwort zurückgesetzt wurde oder der Benutzer aktiviert wurde, werden Sie den Schlüssel aus der Datenbank entfernen, die Ergebnisse in den meisten Zeilen Nullwerte aufweisen, was wiederum einige andere Probleme bringt .

Was dies im Wesentlichen darauf an:

  • Hash Passwörter Ihrer Nutzer ein einzigartiges-for-the-User-Salz mit ( und vielleicht einem globalen, geheimen Salz).
  • einen Schlüssel generieren, indem eine Reihe von zufälligen oder pseudo-zufälligen Quellen wie Zeitstempel, mt_rand() Hashing oder sogar random.org wenn Sie wirklich random stuff wollen.
  • Sie nie Ihr globales Salz oder das Salz verwenden, die für Hashing alles für den Benutzer eindeutig ist, dass der Benutzer erhält Zugriff auf, einschließlich Passwort-Reset-Tasten, Aktivierungsschlüssel, etc.

Bitte nicht, dass ich gar nicht bin: ein Sicherheitsexperten, und ich habe wahrscheinlich eine Reihe von Dingen vergessen, und ich kann einige sehr schlechte Praxis Dinge erwähnt. Nur mein 5 Cent; -)

Andere Tipps

Warum als Grundlage für die Berechtigungsschlüssel alle Daten des Nutzers verwenden?

Ich nehme an, Sie sind das Speichern der de-aktiviert Daten in einer Datenbank, so warum nicht nur einen zusätzlichen Datensatz hinzufügen, die einfach ein zufälliger Schlüssel ist (vielleicht ein md5'ed uniqid mit einigen zusätzlichen Manipulation ) und dann prüfen, gegen das?

Es war sicher genug, um direkt bis zu dem Punkt, wo Sie Ihre Methode im Internet veröffentlicht! Dies liegt daran, dass Sie auf Sicherheit durch Unklarheit verlassen wurden, die keine gute Idee ist.

Sie sollten eine Art von verschlüsselten Hash-Funktion oder MAC ideal verwenden, die einen geheimen Schlüssel nur Ihnen bekannt enthält.

Warum macht Codefeld nicht eindeutiger Index? So wird es nie collsisions sein?

Auch wenn Sie nicht brauchen, Hash aus Benutzereingaben zu erstellen und passen es an Datenbank-Hash (E-Mail-Bestätigung, Passwort zurücksetzen usw.) - Sie können zufälligen Zeichenfolge mit dem Hash-Körper schreiben, md5('xxx'.$username.'xxx'.time().'xxx'.rand())

Warum der Benutzer seinen Benutzernamen eingeben nicht fragen, und ihren Code, wodurch dadurch ein Problem mit Kollision? Sie müssen nicht verlieren alles sicherheits klug wie Sie immer noch für den Schlüssel zu fragen, die sie von der E-Mail bekommen würden, aber Sie würden verhindern, dass sie die Lage, Passwörter andere Benutzer zurückgesetzt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top