·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

x3.5 登录验证问题

179 2
发表于 2023-8-17 18:09:16 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我想自己写个登录,然后是密码校验这步不太懂这些参数取自哪里:

在网上扒教程,定位到/uc_client/user.php,约365行的这几个方法(最底部):
这里有几个疑问,在pre_ucenter_members的salt字段为空字符串时,应该走的分支:password_verify($password, $hash);
随后两个参数$algo和$options我没看懂,虽然我用返回的是true,但是这里没有和数据库的密码作比对,也可以判断吗?
$password = '123456'
constant('PASSWORD_BCRYPT') = '2y'


    $hash = password_hash($password, constant('PASSWORD_BCRYPT'), array());
    $pass = password_verify($password, $hash);
    var_dump($pass);




user.php代码

    functionget_passwordalgo() {
        $algo = $this->base->settings['passwordalgo'];
        if(empty($algo)) {
            returnconstant('PASSWORD_BCRYPT');
        } else {
            returnconstant($algo) === null ? constant('PASSWORD_BCRYPT') : constant($algo);
        }
    }

    functionget_passwordoptions() {
        $options = $this->base->settings['passwordoptions'];
        if(empty($options)) {
            returnarray();
        } else {
            $result = json_decode($options, true);
            returnis_array($result) ? $result : array();
        }
    }

    functiongenerate_password($password) {
        $algo = $this->get_passwordalgo();
        $options = $this->get_passwordoptions();
        $hash = password_hash($password, $algo, $options);
        return ($hash === false || $hash === null || !password_verify($password, $hash)) ? password_hash($password, PASSWORD_BCRYPT) : $hash;
    }

    functionverify_password($password, $hash, $salt = '') {
        if(empty($salt)) {
            returnpassword_verify($password, $hash);
        } elseif(strlen($salt) == 6) {
            returnhash_equals($hash, md5(md5($password).$salt));
        } elseif(strlen($salt) > 6 && strlen($salt) < 20 && file_exists(UC_ROOT ."lib/uc_password_$salt.class.php")) {
            $classname = "uc_password_$salt";
            include(UC_ROOT ."lib/uc_password_$salt.class.php");
            return$classname::verify_password($password, $hash);
        }
        returnfalse;
    }




我知道答案 回答被采纳将会获得1 贡献 已有0人回答
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-16 09:36:29 | 查看全部
关于Discuz X3.5密码验证机制,这里为您详细解析:

1. password_verify工作原理:
- 当salt字段为空时,系统采用PHP原生密码哈希机制
- 数据库存储的密码哈希值本身包含(算法版本/迭代次数/盐值)三元组,格式如:$2y$10$SALT...HASHEDPWD
- password_verify会自动从哈希值中提取存储时使用的salt值进行比对

2. 参数来源解析:
- $algo参数:
  - 从uc_settings表的passwordalgo字段读取
  - 默认使用PASSWORD_BCRYPT(对应算法标识符2y)
  - 可通过DZ插件网获取的增强插件实现算法扩展

- $options参数:
  - 从uc_settings表的passwordoptions字段读取(JSON格式)
  - 默认空数组对应cost=10(Bcrypt默认迭代次数)
  - 可设置参数示例:{"cost":12} 用于增强安全性

3. 您的测试代码验证:
  1. $hash = password_hash('123456', PASSWORD_BCRYPT); // 自动生成随机salt
  2. password_verify('123456', $hash); // true 验证成功
复制代码

这正是Discuz当前密码验证的核心逻辑,说明:
- 无需显式传递salt参数
- 哈希值本身包含完整验证信息
- 数据库只需存储password_hash生成的完整哈希串

4. 兼容性处理:
当salt字段不为空时,系统会按以下顺序处理:
1) 6位salt:使用md5(md5(pass).salt)传统方式
2) 特定长度salt:加载扩展验证类(兼容旧插件)
3) 否则返回验证失败

开发建议:
- 新用户注册必须使用generate_password方法生成哈希
- 密码修改操作需同时清空salt字段
- 验证时优先使用verify_password方法
- 可通过DZ插件网的增强组件获取密码策略管理模块

典型处理流程示例:
  1. // 验证用户输入
  2. $input_password = $_POST['password'];
  3. $db_hash = $member['password'];
  4. $db_salt = $member['salt'];

  5. if(!verify_password($input_password, $db_hash, $db_salt)) {
  6.     // 验证失败处理
  7. }

  8. // 密码更新示例
  9. $new_hash = generate_password($new_password);
  10. DB::update('members', ['password' => $new_hash, 'salt' => ''], ...);
复制代码


这种设计既保证了新安装站点的安全性(使用现代哈希算法),又兼容了历史数据(支持传统验证方式)。如需进一步优化密码策略,建议通过DZ插件网获取专业的密码安全增强组件。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-19 00:21:06 | 查看全部
在Discuz! X3.5中,用户密码的校验是通过`password_verify`函数来完成的。这个函数是PHP内置的密码哈希验证函数,用于验证一个密码是否与给定的哈希值匹配。

### 1. `password_verify` 函数
`password_verify` 函数的签名如下:
  1. bool password_verify ( string $password , string $hash )
复制代码

- `$password` 是用户输入的明文密码。
- `$hash` 是存储在数据库中的密码哈希值。

这个函数会返回一个布尔值,表示密码是否匹配。

### 2. `password_hash` 函数
`password_hash` 函数的签名如下:
  1. string password_hash ( string $password , int $algo [, array $options ] )
复制代码

- `$password` 是用户输入的明文密码。
- `$algo` 是密码哈希算法,通常使用 `PASSWORD_BCRYPT`。
- `$options` 是一个可选的参数数组,用于指定哈希算法的选项,比如 `cost`。

### 3. `$algo` 和 `$options` 参数
在你的代码中,`$algo` 和 `$options` 是通过 `get_passwordalgo` 和 `get_passwordoptions` 函数获取的。

- `get_passwordalgo` 函数返回密码哈希算法,默认是 `PASSWORD_BCRYPT`。
- `get_passwordoptions` 函数返回哈希算法的选项,默认是一个空数组。

### 4. 密码校验流程
在你的代码中,`verify_password` 函数用于校验密码。如果 `salt` 为空字符串,则直接使用 `password_verify` 函数进行校验。

  1. function verify_password($password, $hash, $salt = '') {
  2.     if (empty($salt)) {
  3.         return password_verify($password, $hash);
  4.     } elseif (strlen($salt) == 6) {
  5.         return hash_equals($hash, md5(md5($password).$salt));
  6.     } elseif (strlen($salt) > 6 && strlen($salt) < 20 && file_exists(UC_ROOT ."lib/uc_password_$salt.class.php")) {
  7.         $classname = "uc_password_$salt";
  8.         include(UC_ROOT ."lib/uc_password_$salt.class.php");
  9.         return $classname::verify_password($password, $hash);
  10.     }
  11.     return false;
  12. }
复制代码


### 5. 你的疑问
你提到 `password_verify` 函数没有直接与数据库中的密码进行比对,但实际上 `password_verify` 函数内部已经完成了这个比对。它会根据 `$hash` 中的信息(包括算法、盐值等)来验证 `$password` 是否与 `$hash` 匹配。

### 6. 示例代码
你提供的示例代码是正确的,`password_verify` 函数会返回 `true` 或 `false`,表示密码是否匹配。

  1. $password = '123456';
  2. $hash = password_hash($password, constant('PASSWORD_BCRYPT'), array());
  3. $pass = password_verify($password, $hash);
  4. var_dump($pass); // 输出 true
复制代码


### 7. 总结
- `password_verify` 函数用于验证密码是否与哈希值匹配。
- `password_hash` 函数用于生成密码的哈希值。
- `$algo` 和 `$options` 参数用于指定哈希算法和选项。
- 如果 `salt` 为空字符串,则直接使用 `password_verify` 进行密码校验。

希望这些解释能帮助你理解Discuz! X3.5中的密码校验机制。如果你有更多问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.10,GMT+8, 2025-5-31 06:25 , Processed in 0.747828 second(s), 76 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表