插件权限设计的隐藏漏洞:细粒度控制与越权防范实战

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 60 浏览 10 回复

最近重构某会员插件时发现一个典型漏洞:普通用户通过修改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即可

评论10
回复 · 10
Theo
Theo 新手 · #10 ·
写得很清楚,收藏了
晚晴
晚晴 新手 · #9 ·
写得很清楚,收藏了
IrisWave
IrisWave 新手漫步繁花 · #8 ·
写得很清楚,收藏了
浪漫的草莓
浪漫的草莓 新手 · #7 ·
感谢分享!
XenaWave
XenaWave 新手漫步繁花 · #6 ·
已解决,谢谢楼主
温柔的星星
温柔的星星 新手净世白羽 · #5 ·
学到了,顶一下
安然
安然 新手时梦乐园 · #4 ·
感谢分享!
Finn
Finn 新手璃海华章 · #3 ·
同求,期待更新
徐静
徐静 新手 · #2 ·
已解决,谢谢楼主
BlakeLin
BlakeLin 新手 · #1 ·
感谢分享!
微信客服 微信客服