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

使用password_hash的登录代码无法登录,进度条无限滚动求助

登录验证进度条无限滚动问题排查与解决

我计划采用password_hash进行密码验证,但尝试登录时进度条无限滚动,始终无法完成登录操作。以下是我的密码哈希生成代码与登录代码,恳请各位提供解决该问题的方案。

哈希生成代码

if(empty($_POST['password']))
    unset($_POST['password']);
else
    $_POST['password'] = password_hash($_POST['password'], PASSWORD_DEFAULT);
extract($_POST);
$data = '';
foreach($_POST as $k => $v){
    if(!in_array($k,array('id'))){
        if(!empty($data)) $data .= " , ";
        $data .= " {$k} = '{$v}' ";
    }
}
if(empty($id)){
    $qry = $this->conn->query("INSERT INTO users set {$data}");
    if($qry){
        $id=$this->conn->insert_id;
        $this->settings->set_flashdata('success','User Details successfully saved.');
        foreach($_POST as $k => $v){
            if($k != 'id'){
                if(!empty($data)) $data .= " , ";
                if($this->settings->userdata('id') == $id)
                $this->settings->set_userdata($k,$v);
            }
        }

登录代码

public function login(){
    
    extract($_POST);

    $stmt = $this->conn->prepare("SELECT * from users where username = ? and password = ? ");
    $password = password_verify($password, $hashed_password); 
    $stmt->bind_param('ss',$username,$password);
    $stmt->execute();
    $result = $stmt->get_result();
    if($result->num_rows > 0){
        foreach($result->fetch_array() as $k => $v){
            if(!is_numeric($k) && $k != 'password'){
                $this->settings->set_userdata($k,$v);
            }

        }
        $this->settings->set_userdata('login_type',1);
    return json_encode(array('status'=>'success'));
    }else{
    return json_encode(array('status'=>'incorrect','last_qry'=>"SELECT * from users where username = '$username' and password = md5('$password') "));
    }
}
public function logout(){
    if($this->settings->sess_des()){
        redirect('admin/login.php');
    }
}

问题根源与修复方案

1. 登录逻辑核心错误

password_verify的用法完全错误,且错误地将验证结果(布尔值)当作密码去查询数据库:

  • 代码中直接调用password_verify($password, $hashed_password),但$hashed_password未定义,会触发PHP错误导致脚本中断。
  • password_hash生成的哈希值每次都不同,不能直接用SQL的=匹配密码和哈希,正确流程是先根据用户名查到数据库中的哈希,再用password_verify验证输入密码与哈希是否匹配。

2. 修正后的登录代码

public function login(){
    extract($_POST);
    
    // 先根据用户名查询用户信息,获取数据库中存储的哈希密码
    $stmt = $this->conn->prepare("SELECT * from users where username = ?");
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if($result->num_rows > 0){
        $user = $result->fetch_array();
        // 验证输入密码与数据库哈希是否匹配
        if(password_verify($password, $user['password'])){
            foreach($user as $k => $v){
                if(!is_numeric($k) && $k != 'password'){
                    $this->settings->set_userdata($k,$v);
                }
            }
            $this->settings->set_userdata('login_type',1);
            return json_encode(array('status'=>'success'));
        } else {
            // 密码不匹配
            return json_encode(array('status'=>'incorrect'));
        }
    }else{
        // 用户名不存在
        return json_encode(array('status'=>'incorrect'));
    }
}

3. 其他需修复的问题

  • SQL注入风险:哈希生成代码中直接拼接$_POST内容到SQL语句,极易被注入攻击,建议改用预处理语句完成注册逻辑。
  • 前端解析问题:进度条无限滚动可能是因为后端输出了非JSON内容(比如PHP错误提示、警告),导致前端无法解析返回结果。检查PHP错误日志,确保脚本无语法错误,且只返回标准JSON格式内容。
  • 变量未定义问题:登录代码中$hashed_password未定义,会触发E_NOTICE级错误,可能中断脚本执行,务必确保所有变量都已正确初始化。

内容的提问来源于stack exchange,提问作者Emeka Okoye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:43:15