客服账号在后台只有本店铺权限,把导出链接里的 scope=shop 改成 scope=all,直接下载到 2.3 万条其他店铺订单。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
$shop_id = get_current_shop_id();
if (!current_user_can('export_orders') || $shop_id !== $requested) {
wp_die('forbidden', 403);
}
导出接口只在前端隐藏了按钮,后端按 GET 参数拼查询条件,没有再次校验当前用户能访问的范围。导出往往复用列表查询,列表层的权限过滤被绕开。这一点先确认清楚,后面就不用反复试。
「导出权限校验」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,导出前用 current_user_can 和店铺归属做一次服务端校验;查询条件由服务端根据身份生成 不接受前端传的 scope;用低权限账号手工改参数回归一次。
改完照着核一遍,客服账号改参数后返回 403,导出的文件只含本店铺订单。
