今天在使用phpcms后台时发现用自带的flash上传图片会提示会话过期。以前是没发生过这种情况。一开始以为是动了上传的代码导致的,结果安装一个全新的PHPcms依然存在该情况,看来就不是这的问题了。话不多说,找原因。
第一步当然是登录后台找上传的代码,我们可以在后台看到上传图片是调用的这个地址:index.php?m=attachment&c=attachments&a=swfupload&...
第二步找到对应的方法,打开\phpcms\modules\attachment\attachments.php中的swfupload方法。
上传附件后提示会话过期,请重新登录
这是调用上传图片的请求地址
......
经过多次测试后发下ie浏览器并未产生这种情况,那么原因算是找到了,谷歌浏览器调用flash上传会请求http://www.xxx.com/statics/js/swfupload/这个地址。而PHP的sessionid是同一页面会不发生改变,而phpcms编辑内容是用的新窗口打开网页(或许是这个原因导致的),导致phpsessid改变。
打开\phpcms\libs\classes\session_mysql.class.php文件可以看到phpcms使用的是把sessionid存储到数据库中。
解决办法一:修改下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');
}
}
到这里解决方案就完成了。