diff --git a/admin_2fa_setup.php b/admin_2fa_setup.php index 48a8c37..ce3ea83 100644 --- a/admin_2fa_setup.php +++ b/admin_2fa_setup.php @@ -160,6 +160,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && $mode !== 'none') { secLog('twofa_enabled', ''); $ok = '✅ 二次验证已启用!之后每次登录后台都必须输入 6 位动态码(当前会话也需重新验证)'; } elseif ($act === 'rotate_token') { + // ★ 防误触兜底(2026-09-30 事故):本操作曾是表单第一个 submit 按钮, + // 任何文本框按回车都会隐式提交命中它。现在只有点了「重新生成令牌」 + // 按钮并确认对话框(rotate_confirm=1)才执行;回车等路径一律拒绝。 + if (!isset($_POST['rotate_confirm']) || (string)$_POST['rotate_confirm'] !== '1') { + secLog('token_rotate_denied', '缺少显式确认标记(疑似回车隐式提交),已拒绝'); + throw new Exception('已拦截一次非按钮发起的令牌重置(防误触)。请点「重新生成令牌」按钮并在确认框中点确定。'); + } // ★ 需求:重置访问密钥不得关闭二次验证。 // 1) 写前先拍一张 SEC-UPDATE 区快照; // 2) 最小写入 —— 本次只提交"两个令牌键",绝不再走 $full() 把内存里的 @@ -291,8 +298,9 @@ if (file_exists($secLogPath)) { ❌ ✅ -