CodeIgniter 3 MySQL用户密码验证功能失效排查求助
问题分析与解决方案
嘿,我一眼就看出你的verify_password函数为什么总是返回false了——你踩了一个新手常犯的坑:直接把数据库查询返回的结果对象和密码字符串做比较,这两者根本不是同一类型的数据,自然永远不会相等!
具体问题拆解
$this->db->get()执行查询后,返回的是一个数据库结果对象(比如CodeIgniter框架里的CI_DB_result实例),而不是你要的密码字符串。你必须先从这个对象里提取出实际存储的密码值。- 你还没处理用户不存在的情况:如果传入的用户名在数据库里找不到,查询结果是空的,这时候直接比较也会返回
false,我们需要先判断是否存在有效记录。
修正后的代码
public function verify_password($username, $password){ $this->db->select('password'); $this->db->from('user_account'); $this->db->where('username', $username); $query = $this->db->get(); // 先判断是否查询到有效用户记录 if ($query->num_rows() === 0) { return false; // 用户名不存在,验证失败 } // 从结果对象中取出存储的密码(强烈推荐用哈希存储!) $user_record = $query->row(); $stored_password = $user_record->password; // 用PHP官方推荐的密码哈希验证函数(前提是存储时用password_hash()生成哈希) return password_verify($password, $stored_password); // 如果你暂时还在明文存储(非常不建议!),可以用下面的比较方式: // return $password === $stored_password; }
额外重要安全提醒
千万不要明文存储用户密码!这是严重的安全隐患,一旦数据库泄露,所有用户的密码都会直接暴露。正确的流程是:
- 用户注册时,用
password_hash($password, PASSWORD_DEFAULT)生成哈希值再存入数据库 - 验证时,用
password_verify($input_password, $stored_hash)来匹配,这个函数会自动处理哈希的验证逻辑,不需要手动解密
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

