想象一下,我实现了重置密码链接: 天真的解决方案是在URL中传递person的id(不加密)并询问新密码并更新数据库。这是不安全的,因为user_id对用户可见,并且他们可能会更改URL;这方面的安全补救措施是什么?据我所知,urlencode没有多大帮助,因为它只将非字母字符转换为%和其他一些字符。
PS:我的应用程序是用PHP
如果您需要更多说明,请与我们联系。
答案 0 :(得分:4)
你应该使用令牌。当用户请求重置密码时,您向他发送一封包含唯一(我希望)令牌的电子邮件,该令牌稍后会转换为应修改密码的用户帐户。
令牌可能是几件事的哈希。例如hash(id + email + time())
。由于哈希不可逆,不是加密,您可以在数据库中创建一个简单的表来存储这些令牌。
答案 1 :(得分:1)
我刚为我的应用程序开发了类似的东西。我的想法是生成一个临时密码,并在临时密码的前面附加一种密钥。一旦他们使用新密码登录,我会检查前几个字符是否与我的密钥匹配,如果是,则将它们重定向到密码更改页面。
<强> PHP 强>
public function tempPass() {
$key = '$a4104_';
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
$pass = array();
$alphaLength = strlen($alphabet) - 1; //Creates a temp password
for ($i = 0; $i < 25; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
$pass = implode($pass); //turn the array into a string
//Apply whatever hash function you'd like here
$pass = md5($pass); //Note md5 is just an example
$pass = $key.$pass;
return $pass;
//Possibly add a mail function here to send the user a new password
}
我把它放在我的登录脚本中。
$tempCheck = substr($password, 0, 7);
if($tempCheck === '$a4104_') {
$temp = true;
//They have a temporary password so redirect them
}else{
$temp = false;
//Not using a temporary password
}