Autor
|
Thread
|
24.05.2007 11:52 Uhr
|
"Passwort vergessen" Funktion
|
mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
Hallo!
Hab mir ja eine Passwort vergessen Funktion mithilfe deines Tutorials in meine Site eingebaut. Nun fällt mir auf, dass diese nicht wirklich sicher ist. Denn irgend ein User könnte zum Spass einen anderen Nicknamen eingeben, und der müsste dann sein Passwort immer wieder ändern. Hast du eine Idee wie man es z.b. so machen könnte: Der User muss seinen Nick angeben, wenn dieser in der DB vorhanden ist wird eine Email an die Addresse vom Nick gesandt. Wenn dieser Dann wirklich sein PW ändern will muss er in der Email auf einen Link klicken und erst dann wird das PW geändert.
Den Anfang wüsste ich ja schon wie das geht, aber hab keine Ahnung wie ich das mit dem Link in der Mail realisieren könnte.
Danke im voraus!
Greez mdean
|
|
|
24.05.2007 16:02 Uhr
|
|
Negura
|
Forenposter
|
|
registriert
|
06.12.2006
|
wohnt in
|
|
Beiträge
|
57
|
|
Hallo,
einfach eine Zufallszahl generieren und in der Tabelle 'User' eine Spalte dafür hinzufügen, die standard mäßig auf NULL steht, sollte das Password vergessen werden und der Benutzer will ein neues einrichten, gibt er ja sein Benutzername im Formular an, danach wird eine Zufallszahl generiert und zum passendem Benutzer in der Datenbank abgelegt, was zuvor NULL war.
Diese Zufallszahl sendest du dann mit in die Mail, welche auf das Script verweist, welches dann das Passwort ändert und ebenfalls dem Benutzer zu mailt.
Beispiel:
1. Passwort vergessen und Nick ins Formular eintragen:
2. Zufallszahl generieren und in der Datenbank zum passendem Nick abspeichern
3. E-Mail an den Betroffenen schicken mit Link und Zufallszahl change_password.php?code=$Zufallszahl
4. Klickt der Betroffene auf diesen Link, kann er sein Password ändern
|
|
|
24.05.2007 16:19 Uhr
|
|
Flitze
|
Administrator
|
|
registriert
|
17.10.2006
|
wohnt in
|
Eschwege
|
Beiträge
|
332
|
|
[edit]
Ich werde alt
17 min für nen Post.. blödes Codeformatieren da
[/edit]
Grundsätzlich hast du ja schon alle relevanten Schritte genannt. Zum Ablauf würde ich Folgendes sagen:
User gibt seinen Nickname in ein Formular ein.
Datenbank wird nach diesem Nick durchsucht.
Wird der Name gefunden, wird eine Zufallszahl generiert und im Datensatz des Users in einer dafür vorgesehenen Spalte gespeichert (z.B. PW_ID oder so).
Dann wird eine Email an die Email-Adresse des User gesendet, in der der Link
http://www.example.com/newpw.php?id=DieGeradeGenerierteZufallszahl
steht.
Nun musst du noch die Datei newpw.php anlegen, in der Folgendes steht:
PHP:
<?php
error_reporting(E_ALL);
if(isset($_GET['id'])){
$sql = "SELECT
ID
FROM
User
WHERE
PW_ID = '".db_security($_GET['id'])."'
";
$result = doQuery($sql);
if (mysql_num_rows($result)==1){
$row = mysql_fetch_assoc($result);
$new_pw = rand(100000,999999);
$sql = "UPDATE
User
SET
PW_ID = NULL,
Passwort = '".md5($new_pw)."'
WHERE
ID = '".db_security($row['ID'])."'
";
doQuery($sql);
echo "<h1>Ein neues Passwort wurde generiert</h1>\n";
echo "<p>\n".
"Ihr Account wurde erfolgreich neu generiert.<br /><br />\n".
"Sie können sich nun mit Ihren neuen Passwort ".$new_pw." einloggen.\n".
"</p>\n";
}
else{
echo "<h1>Passwortgenerierung fehlgeschlagen</h1>\n";
echo "<p>\n".
"Sie haben eine ungültige Password ID angegeben.<br /><br />\n".
"Bitte benutzen Sie den Link aus Ihrer Passwort-Email.\n".
"</p>\n";
}
}
else{
echo "<h1>Passwortgenerierung fehlgeschlagen</h1>\n";
echo "<p>\n".
"Sie haben keine Password ID angegeben.<br /><br />\n".
"Bitte benutzen Sie den Link aus Ihrer Passwort-Email.\n".
"</p>\n";
}
?>
Anstatt das PW direkt anzuzeigen kannste natürlich auch nochmal ne Mail schreiben
Gruß
Dieser Beitrag wurde am 24.05.2007 um 16:20:49 Uhr von Flitze zum 1. Mal editiert.
|
|
|
24.05.2007 16:33 Uhr
|
RE:
|
Negura
|
Forenposter
|
|
registriert
|
06.12.2006
|
wohnt in
|
|
Beiträge
|
57
|
|
Zitat:Flitze
[edit]
Ich werde alt
17 min für nen Post.. blödes Codeformatieren da
[/edit]
Besser zulangsam als zuschnell.
Ach ja, eventuell bei jedem Script prüfen ob der Benutzer die Passwortänderung nach 24h stunden auch vollzogen hat, sonst wieder auf NULL zurückstellen.
Sicher ist sicher!
Gruß Negura
|
|
|
24.05.2007 17:36 Uhr
|
|
mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
Vielen Dank für eure Hilfe! Werd wohl noch ne Zeit brauchen bis ich das gecoded hab, meld mich dann wieder
|
|
|
24.05.2007 17:53 Uhr
|
|
mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
öhm hab doch noch ne Frage:
Was passiert denn wenn ich folgendes eingebe:
http://www.example.com/newpw.php?id=Null
Dann würde es doch ein PW für alle generieren oder nicht?
|
|
|
24.05.2007 17:59 Uhr
|
|
Negura
|
Forenposter
|
|
registriert
|
06.12.2006
|
wohnt in
|
|
Beiträge
|
57
|
|
Zitat:
eigentlich für jeden der halt NULL als wert hat
musst du halt gut absichern, ist ja nur n beispiel gewesen.
|
|
|
24.05.2007 18:09 Uhr
|
|
mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
Hmm dann nehm ich nenn Wert der schwer zu eraten ist als Standardwert (039485 oder so etwas), dann sollte das doch eigentlich abgesichert sein oder?
|
|
|
24.05.2007 18:51 Uhr
|
|
mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
Noch ne Frage :
Wie hast du die Funktion db_security() definiert?
EDIT: Irgendwie ist meine Sql syntax falsch..
PHP:
<?php
$sql = "INSERT INTO
user
(PW_ID
)
VALUES (
'".rand(10000,9999999999)."'
)
WHERE
Nickname = '".mysql_real_escape_string(trim($_POST['Nickname']))."'
";
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
?>
Dieser Beitrag wurde am 24.05.2007 um 19:12:27 Uhr von mdean zum 3. Mal editiert.
|
|
|
25.05.2007 13:11 Uhr
|
|
Flitze
|
Administrator
|
|
registriert
|
17.10.2006
|
wohnt in
|
Eschwege
|
Beiträge
|
332
|
|
Hm hab gar nich dran gedacht, dass da noch selbst definierte Funktionen drin sin ^^
PHP:
<?php
// Führt einen SQL-Query aus und gibt im Fehlerfall eine Fehlermeldung aus
function doQuery($sql)
{
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
return $result;
}
// zum Schutz vor SQL Injection
function db_security($str)
{
$str = trim($str);
$str = mysql_real_escape_string($str);
return $str;
}
?>
Zitat:EDIT: Irgendwie ist meine Sql syntax falsch..
Fehlermeldung..?
Zitat:
Dann würde die DB nach dem String 'NULL' durchsucht werden. Der echte NULL-Wert ist aber was anderes als der String 'NULL'
Wenn man wirklich nach NULL-Werten suchen würde, dann müsste man
PHP:
<?php
$sql="SELECT
*
FROM
Tabelle
WHERE
Spalte IS NULL
";
?>
schreiben.
|
|
|