como no vas a dar la opcion de recuperar la contraseña antigua podemos usar un hash de una sola via de un sentido sin vuelta
te recomiendo :
crypt en lugar de md5 muy inseguro
http://es.php.net/manual/es/function.crypt.php
una cosa que ami personalmente me gusta es poner una tabla con los campos user y pass , el pass hasheado con crypt y el usuario igualmente , y te preguntaras como muestro el usuario entonces ¿? otra tabla con los datos del usuario ,en el momento del registro guardamos el user hasheado en la tabla de login por ejemplo y el pass , el user sin hashear en la tabla de los datos
a tus preguntas:
obvia lo de guardar la hora en la bd (no es necesario)
en el momento de envio del email se manda en el link para su posterior comprobacion el time() justo en el momento del envio con time()
una vez el user haga clik en el link se envia a una pagina donde deberas verificar que el campo time no ha superado el tiempo que tu creas conveniente como para caducar
link
verify_account.php?pass=nvujnervnruineinrveriegnre oivns&time=time()
en el momento del clik
verificamos si existe pass y time
y ya verificamos la caducidad
Código PHP:
Ver originalif($_GET['time'] )
$controlador = 3600; //sg 1 HORA DE CADUCIDAD
$controlador_final = $_GET['time'] + $controlador ;
if($controlador_final >= $time_actual)
{
ahora verificamos el password con el de la bd
}else{
echo 'link caducado';
}
ademas de todo esto pondria una capa de seguridad extra con un token , ninguna medida esta de mas