在PHPCMS的发布页面中有个BUG,即使编辑无权限访问某个栏目,但是也还都可以在发布页面的栏目下拉菜单中选择该栏目,并可以将文章发布到该栏目下91发布页。这个BUG如何修复呢?我们先来看看发布页面的下拉菜单是如何生成的。发布页面的模板文件是在 /admin/templates/content_add.tpl.php,其表单是通过下面语句输出的:
if(is_array($forminfos['base'])){foreach($forminfos['base'] as $field=$info){}}线索找到了,就是 $forminfos 这个数组91发布页。这个数组实在 /admin/content.inc.php 这个文件中生成的,我们看看生成代码:
$data['catid'] = $catid;$data['template'] = isset($template_show) ? $template_show :$MODEL[$modelid]['template_show'];require CACHE_MODEL_PATH.'content_form.class.php';$content_form = new content_form($modelid);$forminfos = $content_form-get($data);把数组 $forminfos 打印出来可以发现91发布页,下拉菜单的代码保存在 $forminfos['base']['catid']['form'] 中:
扶贫动态
通知公告
最新动态
新闻
爱心捐助
捐助纪实
爱心回馈
捐款名单
紧急求助
帮助中心
友情连接
对口地区
新闻动态
援建项目
爱心捐助
情系三峡
新闻专区
爱心捐助
政策动态
结对帮扶
援建项目
扶贫现状
扶助对象
新闻动态
爱心捐助
扶贫项目
基金简介
募捐情况
基金用途
账户情况
新闻动态
义工
政策法规
顶新闻栏
顶新闻栏
顶新闻栏
顶新闻栏
顶新闻栏[同时发布到其他栏目]还是投机了一把91发布页,只要把里面的数字正则抽取出来,进行权限验证,没权限的unset掉,余下的再组合到一起,重新生成 $forminfos['base']['catid']['form'] 即可:
$data['catid'] = $catid;$data['template'] = isset($template_show) ? $template_show :$MODEL[$modelid]['template_show'];require CACHE_MODEL_PATH.'content_form.class.php';$content_form = new content_form($modelid);$forminfos = $content_form-get($data);// 判断权限preg_match_all("//", $forminfos['base']['catid']['form'], $matches['str']);preg_match_all("/[1-9]\d/", $forminfos['base']['catid']['form'], $matches['num']);foreach($matches['num'][0] as $key=$value){$allow_manage = $priv_role-check('catid', $matches['num'][0][$key], 'manage');if(!$allow_manage){unset($matches['num'][0][$key]);unset($matches['str'][0][$key]);}}foreach($matches['str'][0] as $key=$value){$opstr .= $matches['str'][0][$key];}$forminfos['base']['catid']['form'] = preg_replace('//', $opstr, $forminfos['base']['catid']['form']);投机成分很高,仅作参考91发布页。