在PHPCMS的發布頁面中有個BUG,即使編輯無權限訪問某個欄目,但是也還都可以在發布頁面的欄目下拉菜單中選擇該欄目,並可以將文章發布到該欄目下。這個BUG如何修復呢?我們先來看看發布頁面的下拉菜單是如何生成的。
發布頁面的模板文件是在 /admin/templates/content_add.tpl.php,其表單是通過下面語句輸出的:
if(is_array($forminfos['base'])) { foreach($forminfos['base'] as $field=>$info) { } }
線索找到了,就是 $forminfos 這個數組。這個數組實在 /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 打印出來可以發現,下拉菜單的代碼保存在 $forminfos['base']['catid']['form'] 中:
<select name="info[catid]" id="catid"><option value="96" >扶貧動態</option><option value="95" >通知公告</option><option value="35" >最新動態</option><option value="36" selected>新聞</option><option value="37" >愛心捐助</option><option value="83" >捐助紀實</option><option value="38" >愛心回饋</option><option value="40" >捐款名單</option><option value="41" >緊急求助</option><option value="73" >幫助中心</option><option value="74" >友情連接</option><option value="43" >對口地區</option><option value="44" >新聞動態</option><option value="45" >援建項目</option><option value="47" >愛心捐助</option><option value="48" >情系三峽</option><option value="50" >新聞專區</option><option value="51" >愛心捐助</option><option value="52" >政策動態</option><option value="53" >結對幫扶</option><option value="54" >援建項目</option><option value="56" >扶貧現狀</option><option value="57" >扶助對象</option><option value="58" >新聞動態</option><option value="59" >愛心捐助</option><option value="60" >扶貧項目</option><option value="62" >基金簡介</option><option value="64" >募捐情況</option><option value="65" >基金用途</option><option value="66" >賬戶情況</option><option value="67" >新聞動態</option><option value="68" >義工</option><option value="69" >政策法規</option><option value="87" >頂新聞欄</option><option value="88" >頂新聞欄</option><option value="89" >頂新聞欄</option><option value="98" >頂新聞欄</option><option value="99" >頂新聞欄</option></select><input type="hidden" name="old_catid" value="36"> <a href=\'\' class="jqModal" onclick="$(\'.jqmWindow\').show();"/> [同時發布到其他欄目]</a>
還是投機了一把,只要把裡面的數字正則抽取出來,進行權限驗證,沒權限的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("/<option.*?<\/option>/", $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('/<option.*option>/', $opstr, $forminfos['base']['catid']['form']);
投機成分很高,僅作參考。