Logo - MyWebsolution.de
User gesamt  :  2053001
User online  :  2
KubaSeoTräume, PHP Forum, PHP Community and more ... MyWebsolution.de!
   
   
 
Registrieren Login User F.A.Q Suche Home

eingeloggt bleiben

MyWebsolution.de Foren » PHP und MYSQL » "Passwort vergessen" Funktion

Seite: 1 2  > Posts pro Seite: 5 10 20
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
Profil ansehen
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
Profil ansehen
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 :P
[/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&ouml;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&uuml;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.


Profil ansehen Mail senden
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 :P
[/edit]


Besser zulangsam als zuschnell. :D

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
Profil ansehen
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:trink:
Profil ansehen
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?
Profil ansehen
24.05.2007 17:59 Uhr
Negura
Forenposter
 
registriert 06.12.2006
wohnt in
Beiträge 57
Zitat:

ö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?


eigentlich für jeden der halt NULL als wert hat :eek:

musst du halt gut absichern, ist ja nur n beispiel gewesen.
Profil ansehen
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?
Profil ansehen
24.05.2007 18:51 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Noch ne Frage xD:

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.
Profil ansehen
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:
ö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?

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.


Profil ansehen Mail senden
25.05.2007 15:33 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Zitat:
Fehlermeldung..?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Nickname = 'mdean'' at line 8

Also könnte ich den Standardwert Null so lassen? Ich werds später dann sowieso noch testen, dann seh ichs ja (kanns mit xampp noch nicht testen, weil der ja keine mails verschicken kann.)
Profil ansehen
25.05.2007 18:15 Uhr
Negura
Forenposter
 
registriert 06.12.2006
wohnt in
Beiträge 57
Zitat:
Also könnte ich den Standardwert Null so lassen? Ich werds später dann sowieso noch testen, dann seh ichs ja (kanns mit xampp noch nicht testen, weil der ja keine mails verschicken kann.)


Bei Xampp ist doch der Mercury Mail Server dabei, vielleicht solltest du dir den mal Konfigurieren.
Profil ansehen
25.05.2007 18:55 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Zum vorherigen Problem, das ist gelöstxD

Aber nochmal zum Mail zeugs:
Hab keine Ahnung wie ich den konfigurieren soll, ist mir zu kompliziert:(
Deshalb kommt jetzt beim Skript immer die Nachricht, dass da Mail nicht versendet werden konnte.
Profil ansehen
26.05.2007 11:22 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Zitat:
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.

Dann müsste ich doch nochmals ne Spalte machen, in ders die Zeit speichert, wenn der generierte Code in die DB eingetragen wurde oder?
Also könnte ich das so machen, das wenn der User auf den Link geklickt hat, es auch die Zeit z.B. auf Null stellt. Dann kann ich in jedem skript prüfen ob die Zeit ungleich Null ist. dann prüfe ob sie schon mehr als 24h ist, und wenn das so ist dann setze diese und den code wieder auf null. Wie mach ich das?

PHP:

<?
$sql 
="SELECT
          Zeit
       FROM
          user
       WHERE
          Zeit != NULL
      "
;
      
$result mysql_query($sql);
      
      if (
$result //Wie prüfe ich jetzt ob es schon mehr als 24h sind?) {}
?>
Profil ansehen
26.05.2007 13:26 Uhr RE:
Negura
Forenposter
 
registriert 06.12.2006
wohnt in
Beiträge 57
Zitat:

if ($result //Wie prüfe ich jetzt ob es schon mehr als 24h sind?) {}


ganz einfach:

$result = timestamp(); // gibt dir den aktuellen timestamp aus, diesen schreibst du in die Datenbank zum User

jetzt müssen wir mal eben nachdenken, wieviel sekunden hat ein tag? warum sekunden? weil der timestamp die sekunden seit einem bestimmten datum zurückgibt, seit dem 1. januar 1970 oder so ungefähr. Nun ja, der Tag hat 60*60*24 Sekunden, als Ergebnis = 86400 Sekunden pro Tag, dann noch schnell prüfen

PHP:

if($alter_timestamp+86400 < timestamp())
{
 echo '24h sind vorbei!';
}


Du kannst natürlich den Timestamp auch direkt die 86400 dazu addieren und diese in die Datenbank schreiben, mach das wie du lustig bist. Dann würde die IF Abfrage allerdings schöner aussehen...

PHP:

if($datenbank_timestamp < timestamp())
{
// ...
}


viel erfolg
Gruß Negura
Profil ansehen
26.05.2007 14:22 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Danke!

Sollte eigentlich klappen. Mal sehen ob es in 24h es auch wirklich wieder zurückstellt.
Profil ansehen
31.05.2007 19:08 Uhr
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
So hab das jetzt mal getestet, aber irgendwo scheint sich wieder ein Fehler in meinem Skript zu verstecken. Das heisst, es gibt zwar keine Fehlermeldung oder so etwas, aber PW_ID und Zeit werden nicht auf Null zurückgestellt, wenn die 24h vorbei sind, sondern den im anderen Skript generierten timestamp bleibt.

Hier mein Code:
PHP:
<? $sql ="SELECT
          Zeit
       FROM
          user
       WHERE
          PW_ID != NULL
      "
;
      
$result mysql_query($sql);
      
$row mysql_fetch_assoc($result);
      
$aktuelle_Zeit = ($row['Zeit'] + 86400);
      if (
$row['Zeit'] > $aktuelle_Zeit) {
      
      
$sql "UPDATE
                      user
               SET
                       PW_ID = NULL,
                    Zeit = NULL
               WHERE
                       Zeit = '"
.db_security($row['Zeit'])."'
                       
                "
;
      
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
      } 
?>
Profil ansehen
01.06.2007 11:48 Uhr
Negura
Forenposter
 
registriert 06.12.2006
wohnt in
Beiträge 57
ich hab mir dein code nicht genau angeguckt, aber das macht kein sinn oder? :oO:
PHP:
<?
if ($row['Zeit'] > $aktuelle_Zeit)
?>


vielleicht so...
PHP:
<?
if (time() > $aktuelle_Zeit)
?>


anderseits speicherst du ja scheinbar nur den normalen, nicht bearbeiteten timestamp, dann übersehe einfach mal oben stehenden code.

prüfe einfach mal ob bei
PHP:
<?
$aktuelle_Zeit 
= ($row['Zeit'] + 86400);
?>

$aktuelle_Zeit auch wirklich das richtige berechnet wird, kann sein das du es so schreiben musst.
PHP:
<?
$aktuelle_Zeit 
$row['Zeit'];
$aktuelle_Zeit += 86400;
?>



Sorry, wie gesagt, code nicht richtig angeguckt.
Gruß Negura
Profil ansehen
01.06.2007 15:28 Uhr RE:
mdean
Forenposter
 
registriert 03.01.2007
wohnt in Schweiz
Beiträge 90
Zitat:
Negura
ich hab mir dein code nicht genau angeguckt, aber das macht kein sinn oder? :oO:
PHP:
<?
if ($row['Zeit'] > $aktuelle_Zeit)
?>


vielleicht so...
PHP:
<?
if (time() > $aktuelle_Zeit)
?>



Hab jetzt das mit $aktuelle_Zeit geändert, ändert aber immernoch nichts...
Den Code von mir ist schon logisch den in $row['Zeit'] steht der timestamp drin, bei dem der User ein neues Passwort angefordert hat. Mit der if Abfrage prüfts ja dann ob der grösser ist als den nach 24h und wenn ja, dann sollte es ja auf Null zurückstellen.

Was könnt es sonst noch sein?
Profil ansehen
01.06.2007 19:41 Uhr
Flitze
Administrator
registriert 17.10.2006
wohnt in Eschwege
Beiträge 332
Hey, ich finde du gehst da eh zu kompliziert ran, ein einfaches update reicht doch:

PHP:
<?php
    $sql 
"UPDATE
                user
            SET
                PW_ID = NULL,
                Zeit = NULL
            WHERE
                Zeit + "
.(60*60*24)." < ".time()."
           "
;
      
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
?>


Dadurch wird jede PW_ID auf NULL gesetzt, die vor mehr als einem Tag (60*60*24 Sekunden) erstellt wurde.


Profil ansehen Mail senden
Seite: 1 2  > no reply
Powered by Pascal Landau © 2006 MyWebsolution.de
Designed by Pascal Landau © 2006 MyWebsolution.de
 
 
 
 
Home Email Impressum Disclaimer Statistik