CodeIgniter中使用PASSWORD_BCRYPT哈希密码的登录功能修复求助
解决思路及修复方案
核心问题
你的登录逻辑完全错误——你直接把用户输入的明文密码和数据库里的BCRYPT哈希值做等值匹配,但PASSWORD_BCRYPT生成的哈希是动态的(每次加密同一密码结果都不同),必须用PHP内置的password_verify()函数来验证,不能直接用SQL的WHERE条件对比。
修复步骤
1. 修改登录模型(MODEL FOR LOGIN)
先根据用户名查询用户的哈希密码,再用password_verify()验证密码是否正确:
public function login(){ // 先根据用户名获取用户信息 $this->db->where('Username', $this->input->post('Username', true)); $result = $this->db->get('users'); if($result->num_rows() == 1){ $user = $result->row_array(); // 用password_verify验证明文密码和哈希值 if(password_verify($this->input->post('Password', true), $user['Password'])){ return $user; }else{ // 密码不匹配 return false; } }else{ // 用户名不存在 return false; } }
2. 检查数据库字段长度
PASSWORD_BCRYPT生成的哈希固定是60个字符,确保你的users表中Password字段的长度至少为60(建议设为255,留有余量),如果字段长度不够,哈希会被截断,导致验证失败。
3. 修复控制器的小问题
控制器里设置flashdata的时候,$this->session->Position写法错误,应该用$user_data['Position']或者$this->session->userdata('Position'):
$this->session->set_flashdata('user_log', 'You are now logged in as ' . $user_data['Position']);
验证逻辑说明
password_hash():负责把明文密码加密成不可逆的哈希值,每次加密结果不同(因为自带随机盐值)password_verify():负责把用户输入的明文密码和存储的哈希值做匹配,不管哈希值看起来多不一样,只要明文正确就能验证通过
内容的提问来源于stack exchange,提问作者jhunlio
相关产品推荐
相关产品推荐

