前段时间,电脑升到WIN11,登录后台想发几篇文章,发现页面无限刷新,基本无法操作,把电脑将回WIN10登录又正常,这段时间AI疯狂,所以叫AI分析一下,得出以下报告,因为不想再折腾系统了,哪位大神是WIN11的有同样情况的可以试试,看看AI是否正的那么Nice!
帝国CMS后台在Win11 Edge浏览器无限刷新 分析报告 ==============================================
一、现象 ------- - Win10 + Edge (旧版) → 后台正常 - Win11 + Edge (新版) → 后台无限刷新,无法进入
二、根因分析 -----------
【核心链路】
最新版 Edge (Chromium) 对 Cookie 的 SameSite 属性默认策略为 Lax。 帝国CMS 的 esetcookie() (e/class/connect.php:183-256) 没有设置 SameSite 属性, 且 PHP 7.3 以下不支持 setcookie() 的 SameSite 参数。
当浏览器收到 Cookie 时,因缺少 SameSite 属性,默认为 Lax 模式。 部分请求下浏览器拒绝发送认证 Cookie → 服务器收不到登录凭据 → is_login() 验证失败 → printerror("NotLogin","index.php") 重定向到登录页 → 登录页检测到用户已登录 → 重定向回后台 → 回到第一步 → 死循环。
【配置文件关键参数】 (e/config/config.php)
ckhash = 0 金刚模式(URL 中必须带 ehash_xxx 和 rhash_xxx 参数) cksession = 0 不使用 SESSION 验证(只用 Cookie) ckpath = / Cookie 作用路径为根目录 ckdomain = (空) Cookie 不限制域名 ckhttponly = 0 HttpOnly 属性关闭 cksecure = 0 自动识别 HTTPS
【User-Agent 因素】 (e/class/functions.php:5119-5121)
DoChECookieRnd() 将 User-Agent 纳入验证哈希计算: $otherinfo = $_SERVER['HTTP_USER_AGENT']; $ecmsckpass = md5(md5($rnd.$ecookiernd).'-'.$ip.'-'.$otherinfo.'-'.$userid...); Win10 和 Win11 的 Edge User-Agent 版本号不同,但通常不影响 (同一浏览器会话内 User-Agent 不会变化)。
【金刚模式 eHash 验证】 (e/class/functions.php:5252-5275)
ckhash=0 时,每个请求必须携带 ehash_xxx 和 rhash_xxx 参数。 若 Cookie 取不到这些参数的值 → hCheckEcmsEHash() 失败 → printerror("FailHash","history.go(-1)") 显示错误页。
【Cookie 设置代码】 (e/class/connect.php:183-256)
function esetcookie($var,$val,$life=0,$ecms=0){ // ... secure, httponly 处理 ... if(PHP_VERSION<'5.2.0') { return setcookie($varpre.$var,$val,$life,$ckpath,$domain,$secure); } else { return setcookie($varpre.$var,$val,$life,$ckpath,$domain,$secure,$httponly); } }
没有设置 SameSite 属性,新版浏览器默认 SameSite=Lax。
三、解决方案 -----------
方案一(推荐,最快解决):关闭金刚模式 HASH 验证
修改 e/config/config.php 第 102 行: 原:$ecms_config['esafe']['ckhash']=0; 改:$ecms_config['esafe']['ckhash']=2;
0 = 金刚模式(最严格,需要 URL 参数验证) 1 = 刺猬模式(中等,只需 POST/GET 验证) 2 = 关闭验证(内网环境足够安全)
保存后刷新浏览器即可。
─────────────────────────────────────────────────
方案二(彻底解决):升级 PHP 并修改 esetcookie() 添加 SameSite 属性
前提:PHP ≥ 7.3
修改 e/class/connect.php 第 252-255 行: 原: } else { return setcookie($varpre.$var,$val,$life,$ckpath,$ecms_config['cks']['ckdomain'],$secure,$httponly); } 改: } else { $ckoptions = [ 'expires' => $life, 'path' => $ckpath, 'domain' => $ecms_config['cks']['ckdomain'], 'secure' => $secure, 'httponly' => $httponly, 'samesite' => 'Lax' ]; if (PHP_VERSION >= '7.3') { return setcookie($varpre.$var, $val, $ckoptions); } else { return setcookie($varpre.$var, $val, $life, $ckpath, $ecms_config['cks']['ckdomain'], $secure, $httponly); } }
保存后刷新浏览器即可。
─────────────────────────────────────────────────
方案三(临时测试):降低 Edge 安全级别
Edge 浏览器 → 设置 → 隐私、搜索和服务 → 安全性 → "增强你在 Web 上的安全性" → 设为"基本"
如果此操作能解决问题,则确认是 Edge 安全策略所致。
四、涉及的核心文件 -----------------
e/config/config.php 系统配置(Cookie、安全模式) e/class/connect.php esetcookie() Cookie 设置函数 e/class/functions.php is_login() / DoChECookieRnd() / hCheckEcmsEHash() e/admin/ReHtml/* <-- 不相关,仅内容刷新功能
五、风险提示 -----------
- 方案一关闭 HASH 验证后,CSRF 防护减弱。内网/有防火墙的环境无问题。 - 方案二最彻底,同时兼容新旧浏览器,推荐长期使用。 - 若 PHP 版本 < 7.3,需升级 PHP 才能使用方案二。
|