2017-02-18 183 views
0

我编写了密码恢复代码。其中,如果任何现有用户在必填字段中输入他的电子邮件,则密码恢复链接将通过他的电子邮件发送,然后如果他点击收到的链接,他将进入密码恢复页面。它工作完美。在电子邮件中设置密码恢复时间

但我需要时间链接。意思是如果我在60秒内为电子邮件设置了60秒密码恢复链接。用户可以恢复密码,否则链接将失败。我不知道该怎么办?请给我提示。

我在表中的字段有:姓名,电子邮件,手机,密码,密码

update.php(对于插入电子邮件发送恢复电子邮件中的链接)

<?php 
include("connection.php"); 
extract($_POST); 
if(isset($email)==true) 
{ 
$query=mysql_query("select * from account where email='$email'") or die(mysql_error());  
$result=mysql_num_rows($query); 

if($result==1) 
{ 
$salt = "498#2D83B631%3800EBD!801600D*7E3CC13"; 
    $restkey = hash('sha512', $salt.$email); 

mysql_query("update account SET passcode='$restkey' where email='$email'") or die(mysql_error()); 

$to="$email"; 
$subject="Password Reset"; 
    $pwrurl = "demo.cstechnology.net/updatepass.php?restkey=".$restkey; 
$message="To reset your password, please click the link below. If you cannot click it, please paste it into your web browser's address bar.\n\n" . $pwrurl . "\n\nThanks,\nThe Administration"; 
    $header="FROM:[email protected]"; 
    mail($to,$subject,$message,$header);  

    } 
    else 
    { 
echo "Invalid Email"; 

} 
} 

?> 
<form action="" method="post"> 
<table> 
<tr><td>Email</td><td><input type="email" required name="email" /></td></tr> 
    <tr><td></td><td><input type="submit" name="submit" value="submit" /></td></tr> 
    </form> 

updatepass。 php(点击电子邮件中的恢复电子邮件链接,密码将会更新)

<?php 
    session_start(); 
    include("connection.php"); 
    extract($_REQUEST); 
    extract($_POST); 

    if(isset($submit)==true) 
    { 
    $query=mysql_query("update account SET password='$password' where passcode='$restkey'") or die(mysql_error()); 
    echo"Password Updated Successfully"; 
    } 



    if(isset($restkey)==true) 
    { 

    echo"<form action='' method='post'> 
    <table> 
    <tr><td>Password</td><td><input type='password' required name='password' /></td></tr> 
<tr><td></td><td><input type='submit' name='submit' value='submit' /></td></tr> 
</form>"; 
} 
?> 
+1

'$ salt =“498#2D83B631%3800EBD!801600D * 7E3CC13”;'对于每个存储的证书,盐应该是唯一的([OWASP:密码存储备忘录](https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet#Use_a_cryptographically_strong_credential-specific_salt)) – Andreas

+0

$ salt是唯一的,我用$ email添加它。 – user3189881

+0

我不会在现场环境中使用此代码;它并不像你想象的那么安全。 –

回答

0

您需要在表中添加额外的timestamp列,所以当用户点击密码恢复保存这里一次。

ALTER TABLE account ADD timestamp INT 

然后,当用户调用updatepass.php时,您需要比较当前时间与表中保存的时间戳。

update.php

$resettimestamp=time(); 
$query=mysql_query("update account set timestamp=$resettimestamp where email='$email'"); 

updatepass.php

$query=mysql_query("select timestamp from account where email='$email'") or die(mysql_error());  
$row = mysql_fetch_row($query); 
$timestamp=$row[0]; 
$currtime=time(); 
$timewindow=60; // 60 seconds 
if ($currtime-$timestamp<=$timewindow) { 
//your logic to reset password 
} 
else { 
//Tell the user that he is too slow) 
} 

也请注意,MySQL的在PHP 7.0中没有更多的支持,这样反而可能的话

使用 的mysqli
+0

谢谢你的回复。它可以是工作。我会确定的。 – user3189881

+0

请标记为已回答的问题,我会在几分钟内用代码示例更新它 –

+0

什么是字段类型? – user3189881

相关问题