如何加密获取URL中的数据

时间:2014-01-07 19:38:35

标签: php security get

想象一下,我实现了重置密码链接: 天真的解决方案是在URL中传递person的id(不加密)并询问新密码并更新数据库。这是不安全的,因为user_id对用户可见,并且他们可能会更改URL;这方面的安全补救措施是什么?据我所知,urlencode没有多大帮助,因为它只将非字母字符转换为%和其他一些字符。

PS:我的应用程序是用PHP

如果您需要更多说明,请与我们联系。

2 个答案:

答案 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
}