使用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
相关产品推荐
相关产品推荐

