You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter登录密码验证失效问题求助

问题分析与修复方案

你遇到的核心问题是模型里的密码验证逻辑完全错误,导致无论输入什么密码都会通过验证。让我一步步帮你理清问题并修复:

错误原因拆解

你的模型代码里这一行是关键错误:

$this->db->where('log_password', password_verify($this->input->post('password'), PASSWORD_BCRYPT));

这里犯了两个致命错误:

  1. password_verify的参数顺序搞反了:这个函数的正确用法是password_verify(明文密码, 数据库存储的哈希值),而你把加密常量PASSWORD_BCRYPT当成了第二个参数,这完全不符合函数的设计逻辑。
  2. 不能在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:47:50