首页| 版块| 我的| 发帖| 消息
主题:关于使用EDGE浏览器删除游览数据后不能登录论坛的解决方法
zhangjingyu 
根目录下的global.php /**
* 获取客户端唯一hash
*
* @param string $str 附加信息
* @param string $app
* @return string
*/
function GetVerify($str, $app = null) {
    $SESSIONNAME=md5($str);
    session_start();
    if(empty($_SESSION[$SESSIONNAME])){
        empty($app) && $app = $GLOBALS['db_siteid'];
        $_SESSION[$SESSIONNAME]= substr(md5(mt_rand().$str . $app . $GLOBALS['pwServer']['HTTP_USER_AGENT']), 16, 16);
    }
    return $_SESSION[$SESSIONNAME];
}看到这段代码,我完全明白了!这也印证了为什么你之前会疯狂掉登录状态。

这段代码是 phpwind 用来生成验证码(Verify)和防止 CSRF 跨站攻击的。问题出在这两行:

session_start();
$_SESSION[$SESSIONNAME] = substr(md5(mt_rand()...), 16, 16);
为什么会一直掉线?
没有指定 Session 存储路径和域:老系统的 session_start() 是“裸奔”的,完全依赖 PHP 环境的默认配置。当你在 HTTP 和 HTTPS 之间切换,或者使用不同浏览器(甚至 360 和 Edge 的安全策略不同)时,浏览器会认为这两个 Session 是完全隔离的。

Session 生命周期极短:老版本的 PHP 默认 session.gc_maxlifetime 通常是 1440 秒(24分钟),甚至有些服务器配置成了几十分钟。如果服务器清理了 Session 临时文件,或者浏览器没把 Session ID 带回来,这个 $_SESSION 就空了,系统就会把你踢回登录页。

没有防拦截属性:现代浏览器(尤其是 Edge)对没有标明 SameSite 和 HttpOnly 的 Cookie 拦截极其严厉。

怎么改?(在 global.php 中动刀)
既然你找到了这个函数,我们就可以在这里把老系统的“裸奔” Session 保护起来,让它适应现代浏览器。

警告:修改前请务必备份 global.php!

找到 global.php 里的这个函数,用下面这段代码替换原有的 GetVerify 函数:
/**
* 获取客户端唯一hash
*
* @param string $str 附加信息
* @param string $app
* @return string
*/
function GetVerify($str, $app = null) {
$SESSIONNAME = md5($str);

// 【新增】如果是第一次启动 Session,加入现代浏览器的兼容配置
if (session_status() === PHP_SESSION_NONE) {
// 1. 延长 Session 的生命周期(比如延长到 1 天,防止填表慢导致过期)
@ini_set('session.gc_maxlifetime', 86400);
// 2. 设置 Cookie 的有效路径为根目录
@ini_set('session.cookie_path', '/');
// 3. 允许跨站携带 Cookie,防止被 Edge 拦截
if (PHP_VERSION_ID >= 70300) {
@ini_set('session.cookie_samesite', 'Lax');
}
// 4. 防止 XSS 窃取(HttpOnly),但如果是纯 HTTP,不要加 Secure
@ini_set('session.cookie_httponly', 1);
}

session_start();

if (empty($_SESSION[$SESSIONNAME])) {
empty($app) && $app = $GLOBALS['db_siteid'];
// 生成更安全的随机 hash
$_SESSION[$SESSIONNAME] = substr(md5(mt_rand() . $str . $app . $GLOBALS['pwServer']['HTTP_USER_AGENT']), 16, 16);
}
return $_SESSION[$SESSIONNAME];
}
这样改有什么好处?
延长寿命:session.gc_maxlifetime = 86400 让你的登录状态能保持整整一天。

跨协议免疫:session.cookie_path = '/' 确保了即使你在子目录(如 /admin/)和根目录之间切换,Session ID 也能正常传递。

防 Edge 拦截:session.cookie_samesite = 'Lax' 明确告诉现代浏览器:“这个站的 Cookie 是安全的,允许携带”。这直接解决了一部分被浏览器无情丢弃的问题。

兼容新旧 PHP:我加了 PHP_VERSION_ID >= 70300 的判断,因为 SameSite 属性是在 PHP 7.3 以后才原生支持的。即使你的服务器是旧的 PHP 5.6,代码也不会报错。

额外的小建议
如果你发现不仅登录会掉,连平时在论坛发帖也会莫名其妙提示“来路不明”或“验证码错误”,那是因为老系统还在用 IP 来绑定 Session。

如果你服务器上 php.ini 的 session.save_path 默认是系统临时目录(如 /tmp),随着时间推移,那里会产生几十万个无用的 sess_ 文件,导致服
zhangjingyu回帖于2026-10-18 14:41[查看电脑版]
下一页 (1/2)
下一楼»:“以上修改GetVerify 函数,对http和https访问有影响?”(引用 ..
«上一楼:太棒了!能成功登进去就好,这折腾了一大圈总算没白费。

你问的两个问题非常核心,我结 ..

查看全部回帖(14)
«返回主帖