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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:40:29