加固-08(P0-05b): 登录哈希写回幂等化,同账号并行会话不被后续登录破坏

背景:P0-07 支付加固回归中发现——admin/agent 登录成功时无条件重新生成
bcrypt 哈希并覆盖 DB 密码列。同一账号第二次登录后,第一次会话的
$_SESSION[xx_password](存"存储值"设计)与 DB 新哈希不再相等,
checklogin 的 WHERE username AND password=会话 重校验失败,
首个会话的后续操作(支付、后台操作)被拒。P0-05 原意只应在"旧格式
惰性迁移"时写回新哈希,现已哈希的存储值重复登录不应再变。

修复(仅当存储值尚未为 bcrypt 时写回新哈希,否则沿用原值):
- admin/ajax.php 登录:$newhash = wq_is_hashed_password($result['password'])
  ? $result['password'] : wq_hash_password($_POST['password'])
- agent/ajax.php 登录:同上
- (API 用户登录 api/Communication.php 已有该条件判断,无需改动)
- 惰性迁移语义不变:旧 md5(admin)/ 旧明文(agent)仍登录一次即升级 bcrypt

回归(P0-05b 13 项全 PASS,8082 内置服务器):
- admin 双会话:第二次登录不改写 DB 哈希;两个会话 checklogin 均有效
- 模拟旧明文代理(DB 直接置明文):登录一次即升级为 bcrypt;
  第二次登录哈希不变;两个会话 checklogin 均有效
- P0-07 回归中的 yezf 双会话并发测试由本修复解锁(先前首会话因
  再登录被破坏而报"代理账号或密码不匹配")
This commit is contained in:
youpaishidifu
2026-10-10 13:06:45 +08:00
parent aaf5fe48c6
commit 94403a1a06
2 changed files with 8 additions and 2 deletions
+4 -1
View File
@@ -44,7 +44,10 @@ if ($_GET['mod'] === 'login'){
$_SESSION['admin_username'] = $_POST['username'];
$_SESSION['admin_id'] = $result['ID'];
$_SESSION['admin_qq'] = $result['qq'];
$newhash = wq_hash_password($_POST['password']);
// P0-05b: 存储值已是 bcrypt 时直接沿用,仅旧格式(md5)惰性迁移。
// 每次登录都重新生成哈希会使同账号的其他已登录会话
// 不再匹配 checklogin 的 WHERE password=会话 重校验
$newhash = wq_is_hashed_password($result['password']) ? $result['password'] : wq_hash_password($_POST['password']);
$_SESSION['admin_password'] = $newhash;
$_SESSION['admin_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
$db->update('sq_admin',array('ID'=>$result['ID']),'AND',array('password'=>$newhash,'loginip'=>get_real_ip(),'logintime'=>time()));