Goedendag,

Als gebruikers hun wachtwoord vergeten zijn, kunnen zij via de link 'wachtwoord vergeten' een nieuw wachtwoord aanvragen. Nadat de gebruiker hun (gebruikersnaam) e-mail heeft ingevoerd checkt password_controle.php of de gebruiker bestaat en of het account actief is. Vervolgens als aan deze voorwaarde is voldaan, word er een unieke code (random)aangemaakt welke ik opsla in de mysql tabel member onder row: reset_password. Vervolgens word een e-mail gestuurd aan de gebruiker met daarin een link met de unieke code om zo doorgestuurd te worden naar reset_password.php. In reset_password.php word gekeken of de unieke code voorkomt en weet zodien met welke gebruiker het te maken heeft. Als de unieke code voorkomt kan de gebruiker een nieuw wachtwoord invoeren + herhaling om vervolgens door te kunnen naar updat_password.php. Dit script update vervolgens het wachtwoord van de gebruiker (md5) en de gebruiker krijgt de melding dat het nieuwe wachtwoord gebruikt kan worden om in te loggen.

Dit script genereert de unieke code als $reset_password + een date/time stempel op $reset_password_aanvraag.

password_controle.php
<?php

function generateRandomString ( $length = 35 ) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
$charactersLength = strlen ( $characters );
$randomString = '' ;
for ( $i = 0 ; $i < $length ; $i ++) {
$randomString .= $characters [ rand ( 0 , $charactersLength - 1 )];
}
return $randomString ;

}
$reset_password= generateRandomString ();
$password_herstel_aantal= $password_herstel_aantal + 1;
//========================================================================
//========================================================================

$db_link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('<p>fout: connect</p>');
mysql_select_db(DB_NAME, $db_link) or die ('<p>fout: select</p>');

$sql="update member set reset_password_aanvraag= NOW(),reset_password='$reset_password',password_herstel_aantal='$password_herstel_aantal'
where id='$id'" ;

mysql_query($sql, $db_link) or die("<p>fout: $sql</p>");
mysql_close($db_link) or die("<p>fout: close</p>");
//mail sturen aan gebruiker met daarin link +unieke code
.......
?>


Nu zou ik nog willen dat de unieke code maar beperkt geldig is (bv 30 minuten na aanvraag). De vraag is nu hoe ik reset_password.php kan laten kijken of de unieke code nog geldig is en dus niet ouder is dan 30 minuten op basis van de date/time stempel in row reset_password_aanvraag?

Dien ik dit in de sql te doen of moet ik vooraf een check inbouwen? en zo ja, hoe zou dit er dan uit moeten zien?



hier nog even de code van
reset_password.php
<?php

$reset_password = $_GET['key'];

$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$query = "SELECT id,account_status,reset_password,status,reset_password_aanvraag
FROM member WHERE reset_password='$reset_password' and account_status='Actief' and status='Actief'";

$res=mysql_db_query("$db","$sql",$mysql_id);;
$result = mysql_query($query) or die ("Couldn't execute query.");
$num = mysql_num_rows($result);

if($num == 0)
{
echo "<center><font color='ff0000'><b>Wijzigings code is niet geldig of bestaat niet.</font></b></center>";
exit();
}
else
{
echo "<form action='update_password.php' method='POST'>";

echo "<center><b>Voer hieronder uw nieuwe wachtwoord in.</b><br>";

include("update_password_form.inc");

echo "<input type='hidden' name='reset_password' value='$reset_password'>\n";
echo "<center><p><input type='submit' value='Volgende'></form>\n";
}

?>
Persoonlijk vind ik 30 minuten best magertjes. Ik zou mikken op minimaal een aantal uren, want stel als een mail niet binnenkomt, en je deze vervolgens later de dag in de spamfilter aantreft.

Anwyay, je kan prima met NOW() + INTERVAL 2 HOURS in je INSERT-query een verloopdatum aangeven in de database.

Verder zitten er ook wat fouten in je code:
- <font> en <center> zijn verouderd in de HTML
- De functies in je query mogen gerust in hoofdletters
- die() en exit() zijn functies die je niet nodig hebt. ZOrg gewoon voor goede foutafhandeling
- Stap van de oude mysql_*() functies af, en gebruik de nieuwe MySQLi of PDO functies.
- Controleer of je $_GET bestaat, om notice-meldingen te voorkomen.

Reageren