CodeIgniter登录密码验证失效问题求助
问题分析与修复方案
你遇到的核心问题是模型里的密码验证逻辑完全错误,导致无论输入什么密码都会通过验证。让我一步步帮你理清问题并修复:
错误原因拆解
你的模型代码里这一行是关键错误:
$this->db->where('log_password', password_verify($this->input->post('password'), PASSWORD_BCRYPT));
这里犯了两个致命错误:
password_verify的参数顺序搞反了:这个函数的正确用法是password_verify(明文密码, 数据库存储的哈希值),而你把加密常量PASSWORD_BCRYPT当成了第二个参数,这完全不符合函数的设计逻辑。- 不能在SQL的WHERE条件中调用PHP函数:数据库无法识别PHP的
password_verify函数,这行代码实际上是把password_verify的返回值(布尔值true或false)和数据库里的哈希密码做对比——哈希密码是长字符串,永远不会等于布尔值,所以这行WHERE条件相当于无效,最终只要用户名存在就会返回true,这就是为什么任何密码都能通过验证。
正确的模型代码修复
把你的can_log_in方法改成这样:
public function can_log_in(){ // 先根据用户名查询对应的用户记录(仅获取密码哈希) $this->db->select('log_password'); $this->db->where('log_username', $this->input->post('username')); $query = $this->db->get('ec_login'); if($query->num_rows() == 1) { // 取出数据库中存储的密码哈希 $user = $query->row(); $hashed_password = $user->log_password; // 用password_verify对比用户输入的明文密码与哈希值 return password_verify($this->input->post('password'), $hashed_password); } else { // 用户名不存在直接返回验证失败 return false; } }
额外的优化建议
- 控制器逻辑可以微调:把获取用户级别的代码移到
form_validation验证通过之后,避免不必要的数据库查询。 - 确认数据库的
log_password字段长度足够(至少60字符):因为BCRYPT生成的哈希结果固定是60字符,如果字段太短会导致哈希值被截断,后续验证也会失败。
内容的提问来源于stack exchange,提问作者lothux1987
相关产品推荐
相关产品推荐

