这个算不算是bug呢?

2016-07-07 15:03 来源:www.chinab4c.com 作者:ecshop专家



ecshop的代码刚看到权限分配这里,发现了一个问题。
在admin/privilege.php?act=allot,有这么一段代码:

foreach ($action_group['priv'] AS $key => $val)
{
$priv_arr[$action_id]['priv'][$key]['cando'] = (strpos($priv_str, $val['action_code']) !== false || $priv_str == 'all') ? 1 : 0;
}

外面的循环是在把admin_action表中的所有权限循环出来。

里面的语句,$priv_str保存了管理员所具有的所有权限,逗号相隔;$val['action_code']保存了当前循环所得的权限,通过strpos函数来比对,如果$priv_str中存在$val['action_code'],就说明管理员具有当前的权限,$priv_arr[$action_id]['priv'][$key]['cando']就赋值为 1,反之为0.

如果等于1,权限列表的checkbox的checked就为true,反之为false。

但是这里比对的方法是用的是strpos函数,问题就出现了。

比如:languages/zh_cn/admin/priv_action.php文件中,有一行:$_LANG['goods_manage'] = '商品添加/编辑';,我再在这个文件中添加一行:$_LANG['goods_manage_all'] = '全部商品添加/编辑';然后在admin_action表中增加条记录 "insert into admin_action values (0,1,'goods_manage_all')", 再执行admin/privilege.php?act=allot页面,就有了'全部商品添加/编辑'这个选项了。
现在开始给一个管理员分配权限,我只选择'全部商品添加/编辑',不选择'商品添加/编辑',点击保存,然后再进入给管理分配选项的页面,可以看到,明明我没有选择 '商品添加/编辑',但是 '商品添加/编辑' 这个选项被勾上了。


把这个情况用刚才的代码解释就是:strpos('goods_manage_all', 'goods_manage');
不知道这个算是一个bug吗?

回答:
这个代码不是很规范,应该算一个小bug吧,要验证得更严格一些,最好用"=="去经较,肯定不会出错的