今天在使用phpcms后台时发现用自带的flash上传图片会提示会话过期。以前是没发生过这种情况。一开始以为是动了上传的代码导致的,结果安装一个全新的PHPcms依然存在该情况,看来就不是这的问题了。话不多说,找原因。
第一步当然是登录后台找上传的代码,我们可以在后台看到上传图片是调用的这个地址:index.php?m=attachment&c=attachments&a=swfupload&...
第二步找到对应的方法,打开\phpcms\modules\attachment\attachments.php中的swfupload方法。
上传附件后提示会话过期,请重新登录
![phpcms后台上传图片提示会话过期解决办法](https://lmqyu.cn/wp-content/uploads/2022/04/e2a80f07cfb661c5ed20c3e4a644a7b7_20200804909741.png)
这是调用上传图片的请求地址
![phpcms后台上传图片提示会话过期解决办法](https://lmqyu.cn/wp-content/uploads/2022/04/ebea4b7488975d92e5275845e7cddb3b_20200804364027.png)
![phpcms后台上传图片提示会话过期解决办法](https://lmqyu.cn/wp-content/uploads/2022/04/e401e21a6e32a51a331fc8bcf05bc36b_20200804712389.png)
......
经过多次测试后发下ie浏览器并未产生这种情况,那么原因算是找到了,谷歌浏览器调用flash上传会请求http://www.xxx.com/statics/js/swfupload/这个地址。而PHP的sessionid是同一页面会不发生改变,而phpcms编辑内容是用的新窗口打开网页(或许是这个原因导致的),导致phpsessid改变。
打开\phpcms\libs\classes\session_mysql.class.php文件可以看到phpcms使用的是把sessionid存储到数据库中。
![phpcms后台上传图片提示会话过期解决办法](https://lmqyu.cn/wp-content/uploads/2022/04/0046053df9d1bd6f94fc89f1b7b57fa4_20200804411712.png)
![phpcms后台上传图片提示会话过期解决办法](https://lmqyu.cn/wp-content/uploads/2022/04/854c702f4c6c1c8f6beab614e3906ae0_20200804378994.png)
解决办法一:修改下phpcms的后台验证(改动比较少,但是依然使用flash上传),而且会修改phpcms的安全性(虽然漏洞已经很多了)。
后台登录增加角色id的cookie,文件位置:\phpcms\modules\admin\index.php大约100行增加
if(!$r['lang']) $r['lang'] = 'zh-cn';
param::set_cookie('admin_username',$username,$cookie_time);
param::set_cookie('siteid', $default_siteid,$cookie_time);
param::set_cookie('userid', $r['userid'],$cookie_time);
param::set_cookie('roleid', $r['roleid'],$cookie_time);//此行为新增
param::set_cookie('admin_email', $r['email'],$cookie_time);
param::set_cookie('sys_lang', $r['lang'],$cookie_time);
修改后台验证,文件位置:\phpcms\modules\admin\classes\admin.class.php搜索check_admin方法替换
/**
* 判断用户是否已经登陆
*/
final public function check_admin() {
if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'public_card'))) {
return true;
} else {
$userid = param::get_cookie('userid');
$_SESSION['userid'] = $userid;
$_SESSION['lock_screen'] = 0;
$_SESSION['roleid'] = param::get_cookie('roleid');
if(!isset($_SESSION['userid']) || $userid != $_SESSION['userid'] || !$userid) showmessage(L('admin_login'),'?m=admin&c=index&a=login');
}
}
到这里解决方案就完成了。