PHP Passwort vergessen funktion -> Valid Link nach 24Stunden automatisch löschen?

volcem

Lieutenant
Registriert
Dez. 2007
Beiträge
1.021
Guten,

Ich schreibe gerade ne "Passwort vergessen" Funktion, leider hänge ich an einem Punkt irgend wie feste!
Achso Passwörter sind verschlüsselt MD5();

So möchte ich das gerne machen:

--> Kunde trägt bei "passwort" vergessen seine Email ein
--> Es wird gecheckt ob Email im System vorhanden ist.
--> Script generiert ein code (30Zeilen) der in einer DB gespeichert wird, mit Zusatz Informationen wie "id" - "userid" "email" - "code(die 30zeilen)".

Kunde bekommt eine E-mail:

bla bla new.php?valid_code=der generierte code.

Kunde ruft den Link auf, es wird geprüft und ein neues Passwort wird generiert und dem Kunde per E-mail geschickt!
Soweit binsch nun.

Aber:

Wenn der Kunde kein neues Passwort will, weil es im wieder eingefallen ist, oder sich irgend einer einen Spaß erlaubt möchte ich das der link und die Daten die noch in die DB geschrieben wurden wieder gelöscht werden ( 24Stunden ).

Meine Idee:

Beim Anlegen des Code´s Zeit mit rein schreiben Time()

dann per PHP prüfen ob Zeit abgelaufen ist, wenn ja, löschen!

etwa so in der Art:

PHP:
$sek = 1*86400;
	$d = gmtime() - $sek;
	mysql_query("DELETE FROM x_pw WHERE added >= $d");

Irgend wie so :-(

Kann da wer nen denk anstoß geben?

lg
 
PHP:
 echo 'SELECT * FROM x_pw  WHERE ( TO_DAYS( NOW() )-TO_DAYS(added) > 1)';
Probier das mal. Das feld in der datenbank kann zb. nen Timestamp sein.
 
Verstehe nicht ganz -.-

Hab jetzt soweit alles fertig:
->erstellen des code´s
->Speichern
->Email
->Check = OK (code vorhanden)
->Generiere neues PW
->Speichere das neue PW in der Datenbank
->Email mit Passwort an den Kunden
->Kunde hat ein neues PW und kann sich damit einloggen.

Sobald der Kunde den Link aufruft und sein neues PW zugewiesen bekommt lösche ich die Daten direkt aus der Tabelle wo er den code und den rest gespeichert hat um es zu prüfen, das ja kein Problem.

Aber mit dem löschen des links verstehe ich nicht(wenn kunde den nicht innerhalb von 24stunden aufruft) -.-

Hier mal meine SQL Tabelle:

PHP:
CREATE TABLE IF NOT EXISTS `x_pw` (
  `id` int(10) NOT NULL auto_increment,
  `email` varchar(50) collate utf8_bin NOT NULL,
  `added` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `hash` varchar(50) collate utf8_bin NOT NULL,
  `userid` varchar(10) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;
 
Zuletzt bearbeitet:
So hab ich das mit dem Zeitstempel gelöst:
PHP:
$zeit = time(); //aktuelle Zeit in Sekunden (seit 1. Januar 1970 00:00:00)
$dauer = '36000'; //Zeit in sec wie lange der Link aktiv sein soll (hier 10 Stunden)
$abgelaufen = $zeit - $dauer;
$sql = ("DELETE FROM log WHERE aufrufzeit <= '$abgelaufen'"); //Nimmt alle Einträge raus, die länger als 36000 Sekunden her sind.
mysql_query($sql);
Für das Eintragen muss natürlich nur $time in "aufrufzeit" in die Datenbank eingetragen werden.
Der Eintrag "aufrufzeit" ist in der Datenbank dabei einfach eine ganz normale Zahl.


Aber die Frage ist, wieso du überhaupt einen Eintrag in die Datenbank benötigst.
Den generierten Code kann man ja nicht erraten.
Ich hab meine "Passwort vergessen"-Funktion einfach so geschrieben, dass zwar eine E-Mail mit einem Code generiert wird, aber dieser nirgends in einer Datenbank gespeichert wird.
Wenn jetzt ein Benutzer den Link in der Mail aufruft, erzeuge ich einfach den Code nochmal und prüfe, ob diese identisch sind.
Dann hat man auch kein Problem mit dem Löschen irgendwelcher Datenbankeinträge.
 
Zuletzt bearbeitet:
Ich möchte ja nicht das man den link später nochmal aufrufen kann.
Also nach 24Stunden soll der Link ungültig werden, wenn ich den code so nochmal Generiere und überprüfe kann er den Link ja noch in einen halben Jahr aufrufen.. etwas übertrieben aber weißt sicher was ich mein ;-)

Danke, ich werde es mal so testen!
 
Ja stimmt schon.
Aber ob ich jetzt direkt die E-Mail aufrufe oder vorher nochmal auf "Passwort vergessen" klicke ist ja im Grunde egal.
Und wenn das Passwort geändert wurde, dann gibt es natürlich auch einen anderen Code und damit wird der Link in der E-Mail ja sowieso ungültig.
 
Zuletzt bearbeitet:
sobald das passwort vergessen beantragt wird einfach den dazugehörigen timestamp in die datenbank eintragen.
wird der link mit dieser ID aufgerufen, aber die zeit ist überschritten, dann funktioniert der link einfach nicthmehr:
if (timestamp_neu - timestamp_alt > 24*60*60) {
nix da!
}

und bei jedem aufrufen der passwort vergessen funktion einfach alte und nicht mehr gebrauchte einträge löschen (wieder über die timestamp testen)



wieso eigentlich sofort ein neues passwort generieren, und nicht einfach einen link schicken, mit dem man sich auch ohne passwort einloggen kann? Dann kann der user selbst entscheiden wie das neue passwort heissen soll, wenn er es denn ändern möchte, weil er es bei der user admin seite eintragen kann...
 
hmm die Idee vom PW-toXic ist auch nicht schlecht.

Ich werde das mal so vervollständigen!

@Destruction

Für meine zwecke hab ich diesen Weg gewählt!


Sry für den Doppelpost, aber irgend wie will da was nicht..

Siehe test.php

PHP:
<?PHP$res = mysql_query("SELECT * FROM x_pw ORDER BY id DESC LIMIT 50") or die(mysql_error());
    while ($row = mysql_fetch_array($res))
	{ 

echo $row["hash"]; ?> <br /><?PHP
echo $row["added"]; ?>  <br />
<?PHP
 }
?> <br /> <?PHP

function get_date_time($timestamp = 0)
{
if ($timestamp)
return date("Y-m-d H:i:s", $timestamp);
}

 $zeit = get_date_time(time()); //aktuelle Zeit in Sekunden (seit 1. Januar 1970 00:00:00)
$dauer = '200'; //Zeit in sec wie lange der Link aktiv sein soll (hier 10 Stunden) 36000
$abgelaufen = $zeit - $dauer;
$sql_check = ("DELETE FROM x_pw WHERE added < $abgelaufen"); //Nimmt alle Einträge raus, die länger als 36000 Sekunden her sind.
mysql_query($sql_check) or die (mysql_error()); 
 
 echo "löschen der alten einträge hat geklappt"; echo "<br />";
 echo get_date_time(time());
 ?>

Hab echo mal reingehauen um zu gucken ob die Zeit angaben "übereinstimmen" (gleiches Format)
Diese sind im gleichen Zeit Format aber trotzdem löscht das script nichts.
Der alte Wert (hier hash) bleibt in der tabelle, obwohl 200sekunden zwischen den beiden zeiten liegen.

Was läuft hier falsch, bekomme auch keine Fehlermeldung :-(
 
Bau dir doch mal ne Klasse und bau dir sinnvoll benannte funktionen, damit man mit dem code auch mal was anfangen kann ohne ihn vorher studieren zu müssen ;)
Desweiteren etwas, was ich in dem thread wohl kein zweites mal sagen werde:
Wir sind hier nicht da um kostenlos deinen Code zu debuggen. Das was du hier machst: du bastelst ein paar minuten an irgendeinem code... er geht nicht und du haust ihn vollständig einfach ins forum und hoffst, dass dir jemand hilft.
NAAAJAAAA
also das is ja nicht gerade das wahre.
Du lässt dir keine variablen ausgeben (echo.. var_dump($var) print_r($array) etc) um überhaupt mal ahnen zu können wo der Fehler liegt. Debuggen musst du schon selbst..

und ansonsten:
Du ziehst von einem String eine zahl ab. ($abgelaufen = $zeit - $dauer). Darauf solltest du aber selbst kommen. Ich fühle mich daher ein wenig ausgenutzt ;)
 
Vergleiche zwischen MySql Timestamp und php Timestamp hab ich noch nie gemacht!

Das ist alles hingeklatscht weil es eine Test Datei ist...

Jap du hast recht, ich "bastel"mir irgend was zusammen oO

Wenn es dir nicht aufgefallen ist, der code ist hier gepostet worden!
Ausserdem klatsch ich hier keine ganzen Datei rein, jaa die Testdatei sieht echt scheiße aus, deswegen auch Testdatei. Da "bastel" ich wirklich, teste und wenns geht Arbeite ich den Sauber ins System ein?
Bastelst du nicht erst an Testdateien bevor du was in dein Projekt schreibst? Denke doch!

Nicht jeder kann alles wissen, merkste selber wa? Denkste du weißt alles? Denke nicht!
Da ich diese vergleiche mit Zeit und Mysql Timestamp noch nie gemacht habe, hab ich es hier gepostet!
Wenn es dir aufgefallen ist: oben in meinen ersten Thread hab ich geschrieben denk anstoß kein fertigen sauber gearbeiteten code!!

Naja werde mal das manuell durchkauen zum Thema Zeiten etc.
 
tja zweite chance angeboten, aber nicht angenommen, sondern mit gegenangriffen gestartet ;) Mir gleich ;)

Nur soviel: Das hier hat rein garnichts mit wissen zu tun, sondern damit, dass du nicht bereit bist den minimal aufwand zu leisten um herauszufinden woran es den liegen könnte! Also das Problem bzw den Fehler eingrenzen. Dafür brauch tman kein wissen, da du offentsichtlich den Befehl "echo" ja schon kennst.

Nunja, jetzt darfste selber suchen oder ne andere person zum ausnutzen suchen ;)
 
Wo hab ich dich denn ausgenutzt?

Ich hab niemals verlangt das man mir hier alles vorkaut.. Das ich den code hier gepostet habe der hier freundlicherweise als Hilfestellung gepostet wurde war vielleicht falsch.

Super jetzt sieht das so aus als wäre ich der voll depp.

Will mich ja nicht streiten, wieso auch? Hab ich ja keinen Grund zu, vielleicht war das was ich gepostet habe nicht gerade freundlich, das muss ich zugeben. Entschuldigung, wollte keinen angreifen.
 
PHP:
 $zeit = get_date_time(time()); //aktuelle Zeit in Sekunden (seit 1. Januar 1970 00:00:00)
$dauer = '200'; //Zeit in sec wie lange der Link aktiv sein soll (hier 10 Stunden) 36000
$abgelaufen = $zeit - $dauer; 

Echo $zeit;
echo $dauer;
echo $abgelaufen;

sollt reichen ^^
 
Zuletzt bearbeitet:
Danke ich hab es aber gestern so fertig geschrieben:

PHP:
$secs = 86400;
$dt = sqlesc(get_date_time(time() - $secs));
$sql =("DELETE FROM x_pw WHERE added <= $dt"); 
mysql_query($sql) or die (mysql_error());

Wenn 24stunden um sind, werden alle alten Einträge die 24stunden zurück liegen gelöscht!
 

Ähnliche Themen

Antworten
5
Aufrufe
1.342
Zurück
Oben