0

我的问题是即使我输入了错误的密码我仍然可以登录。我似乎不知道我如何解码密码是否有问题。

加密密钥:

$config['encryption_key']   = 'formcreatormj';

登录代码:

function login($email,$password){
    $pw = $this->encrypt->decode($password);

$this->db->where('email',$email);
    $this->db->where('password', $pw);

    $query=$this->db->get('user');

   if($query->num_rows()>0){
        foreach($query->result() as $rows){
            //add all data to session
            $this->addSession($rows->id, $rows->username);
        }

        return true;
    }
    return false; 
}
4

2 回答 2

2

应该使用 Encryption 类来处理密码。密码应该单向散列,以防止原始明文被轻易恢复。Codeigniter 的Encryption 类提供双向加密,不适合密码。

相反,您应该使用bcrypt-如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

于 2013-10-04T18:16:54.267 回答
0

您正在处理错误的散列。通常,您会将密码的哈希值存储在数据库中。即当用户注册时,您$this->encrypt->encode()输入密码并将其存储在数据库中。

下次用户尝试登录时,您再次对他们在登录时输入的密码进行哈希处理,并将其与数据库中的哈希密码进行比较。

但是,因为默认情况下,codeigniter 使用 mcrypt,所以这些哈希值不会匹配。因此,您需要做的是从数据库中提取哈希,解密并将其与提交的密码进行比较。

$this->db->where('email',$email);
$query = $this->db->get('user')->row(0);

if($this->encrypt->decode($query->password) == $password){
    //password OK
}else{
    //password not OK
}

您正在做的是尝试解密未加密的提交密码。


编辑:强烈同意@xiankai 你真的应该使用 bcrypt 作为密码。

于 2013-10-04T13:22:18.787 回答