安全闸门最小化信息透露:非白名单请求统一返 nginx 原生 404,新增 DB 引导标记

- secGatePage / secGateApi 不再回 403(页面 HTML 与 JSON),一律 secNginx404(),
  探测者分不清是文件不存在还是被拦截;拒绝仍写 db/security.log。
- 新增 secIsBootstrapped() 双判据:config SEC-UPDATE 区已有令牌(既有站点即刻生效)
  或 web.db 的 sec_bootstrap 标记表有行(secWriteConfig 保存时写入)。
- 全新部署首次访问(两者皆空)为引导模式:放行并把 admin.php 跳到 admin_2fa_setup.php,
  配齐白名单/访问令牌/2FA 后一保存即自动转强制;读库异常从严按已引导。
- secTokenGate 引导模式不强制,已引导后照旧 ?token= 否则 404。
- setup 页状态卡片新增「门禁状态」展示;config.php 注释同步 404 与引导标记说明。
- 不调用 SQLite3::enableExceptions(false):PHP 8.4 该写法触发 E_DEPRECATED,
  提前输出会把 nginx404 的状态行挤掉(404 变 200),改由 @ + try/catch 兼容新旧版本。
This commit is contained in:
ypsdf1
2026-10-02 13:42:02 +08:00
parent 2f5f02b72d
commit 196e20868e
4 changed files with 191 additions and 44 deletions
+2 -1
View File
@@ -2,7 +2,8 @@
// ★ 紧急加固(2026-09-29):三层加固的第三层 + 第二层
// 第三层动态令牌:必须 admin.php?token=<SEC_ACCESS_TOKEN> 才放行,
// 不带/带错令牌一律返回 nginx 原生 404 页(与文件不存在时完全一致)。
// 注意必须放在 secGatePage() 之前 —— 否则白名单 403 会暴露这个文件确实存在。
// 注意必须放在 secGatePage() 之前 —— 令牌层先判(两层现已统一返回 nginx 404,
// 但顺序仍要保持:引导模式下令牌层放行、页面层负责跳配置页)。
// 第二层 IP 白名单 —— 页面本身也只对白名单 IP 开放。
require_once __DIR__ . '/security.php';
secTokenGate();