boot恢复模式不再404死胡同:持boot凭据的请求一律302回引导配置页

- security.php 新增 secBootRecoveryRedirect():secGatePage 遇到「不在 IP 白名单但持有效 boot 凭据」的请求,改 302 送回 admin_2fa_setup.php(唯一豁免页),不再返回 nginx 404;secBootAuthenticate 增加凭据预判(无 boot 参数、无会话 cookie、无活动会话则直接判失败),避免路由覆盖面变大后给每个探测请求都 session_start() 刷 session 文件。
- admin.php 令牌层改 secTokenGate(true):admin.php?boot=<引导令牌> 才能进入恢复路由(原先在令牌层就 404);页面对非白名单 IP 依旧不渲染。
- admin_2fa.php 持 boot 但不在白名单 → 直接送回配置页,不再掉进 admin_login.php / admin.php?token= 的 404 弹簧。
- admin_2fa_setup.php:boot 模式隐藏「← 返回」、顶部加恢复指引横幅、后台唯一入口下加 404 警告;新增  修正「刚保存白名单但 ADMIN_IP_WHITELIST 常量本请求内未刷新」导致横幅误报。
- 背景(db/security.log 实录):2026-10-05 09:35:58 boot_unlock 成功,09:35:59 即被 admin.php ip_block,09:42 只能靠宝塔手工改 config.php 脱困。
This commit is contained in:
ypsdf1
2026-10-05 10:56:35 +08:00
parent 99da971fbf
commit e040e8c994
4 changed files with 89 additions and 3 deletions
+6 -1
View File
@@ -4,9 +4,14 @@
// 不带/带错令牌一律返回 nginx 原生 404 页(与文件不存在时完全一致)。
// 注意必须放在 secGatePage() 之前 —— 令牌层先判(两层现已统一返回 nginx 404,
// 但顺序仍要保持:引导模式下令牌层放行、页面层负责跳配置页)。
// ★ boot 恢复模式(2026-10-05):令牌层也认 boot 令牌 —— 否则被锁在外面的运维
// 敲 admin.php?boot=<引导令牌> 会在令牌层就吃 404,连"送回引导配置页"的
// 恢复路由(secGatePage 里)都到不了。放行令牌层后,下面的 secGatePage()
// 会把非白名单的 boot 持有者 302 到 admin_2fa_setup.php 去把自己加白,
// 页面本身对非白名单 IP 依旧不渲染(白名单校验没有被绕过)。
// 第二层 IP 白名单 —— 页面本身也只对白名单 IP 开放。
require_once __DIR__ . '/security.php';
secTokenGate();
secTokenGate(true);
secGatePage();
// 令牌在 URL 上,禁止页面内任何外链通过 Referer 把它带走
header('Referrer-Policy: no-referrer');