插件权限设计的隐藏漏洞:细粒度控制与越权防范实战
最近重构某会员插件时发现一个典型漏洞:普通用户通过修改URL参数id值就能查看他人订单。问题出在只做了基础角色鉴权,却忽略了数据层级权限校验。分享几个实战中容易忽略的细节点:
1. 二次校验陷阱
// 错误示范:仅判断是否登录
if(!current_user_can('read')){
die('无权限');
}
// 正确做法:增加数据归属校验
$order = get_order($_GET['id']);
if($order->user_id != get_current_user_id()){
wp_die('非法访问', 403);
}
2. CSRF防御的自动化方案 在表单类插件中推荐使用Nonce机制:
// 生成令牌
wp_nonce_field('update_user_profile');
// 验证令牌
check_admin_referer('update_user_profile');
注意Nonce的有效期默认24小时,涉及敏感操作建议设置更短时效。
3. SQL注入的现代防御 不要再手动拼接SQL语句!使用预处理语句:
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}orders
WHERE user_id = %d AND status = %s",
$user_id,
$status
);
对于LIKE查询要单独处理:esc_like($search_term) + %通配符组合使用
4. 权限颗粒度控制技巧
利用WordPress的map_meta_cap过滤器实现:
add_filter('map_meta_cap', function($caps, $cap, $user_id, $args){
if($cap === 'edit_post' && get_post_type($args[0]) === 'custom_order'){
$caps[] = 'edit_custom_orders'; // 自定义权限
}
return $caps;
}, 10, 4);
然后在add_menu_page时指定这个capability即可
最新打赏

