如何不借助session或文件包含将注册文件的密码哈希$string传入登录文件
问题解决方案
首先需要纠正你现有代码的语法和用法错误:
你当前的
password_verify调用逻辑存在问题,不需要在校验时二次调用password_hash,且语法本身不完整:
// 错误写法 if($row['user_name'] === $name && password_verify($pass,password_hash $string)) {
password_verify的正确用法是:第一个参数传入用户输入的明文密码,第二个参数直接传入预先生成好的密码哈希值即可,不需要额外做哈希处理。
核心可行方案(均满足不使用session、不引入注册文件的要求)
方案1(最推荐,符合开发规范)
密码哈希本身是用户身份校验的核心持久化凭证,不应该存储在业务脚本的临时变量中,你可以直接将注册阶段生成的哈希值存入数据库用户表:
- 注册逻辑中,调用
password_hash()生成的结果直接写入用户表的password_hash专用字段,禁止存储明文密码 - 登录逻辑中,先根据用户输入的用户名查询数据库对应用户行,取出
password_hash字段的值传入校验逻辑即可
修正后的登录校验代码参考:
// 提前根据用户输入的用户名查询对应账号信息 $row = $db->query("SELECT user_name, password_hash FROM users WHERE user_name = ?", [$name])->fetch(); if ($row && password_verify($pass, $row['password_hash'])) { // 校验通过,登录逻辑处理 }
方案2(适合暂时不调整数据库存储的场景)
你可以将身份校验相关的逻辑和注册表单视图代码做拆分:
- 新建独立的公共逻辑文件
auth_common.php,把注册阶段生成密码哈希、读取哈希凭证的逻辑都放在这个文件中,不要写入任何注册表单的输出代码 - 注册文件、登录文件分别单独引入
auth_common.php即可,不会触发注册表单的加载,也不需要引入完整的注册文件
内容的提问来源于stack exchange,提问作者Gujjar Sab
相关产品推荐
相关产品推荐

