帝国论坛帝国网站管理系统交流区帝国CMS使用交流[分享]帝国CMS后台在Win11 Edge浏览器无限刷新 分析报告 【本版专题贴子】  
主题:[分享]帝国CMS后台在Win11 Edge浏览器无限刷新 分析报告 [加入收藏夹]   

ccxxww
用户头衔:书生

精华贴   :0
发贴数   :2
经验值   :20
注册时间:2014-02-02
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
[分享]帝国CMS后台在Win11 Edge浏览器无限刷新 分析报告

前段时间,电脑升到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 才能使用方案二。




2026-06-06 00:15:04 已设置保密 顶部 回复 引用 报告 编辑 删除

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1