会员专享的素材包,退出登录后把下载地址粘到地址栏照样能下,返回 200 和完整文件,页面上的权限提示形同虚设。乍看像缓存或者权限的锅,追下去往往不是。
if ( ! is_user_logged_in() || ! current_user_can( 'download_premium' ) ) {
status_header( 403 );
exit;
}
追下去是这么回事:权限判断写在模板里,只控制按钮是否显示,真正的文件请求没有任何校验。文件放在公开目录,谁拿到地址都能取。
「下载权限校验」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,下载走统一的处理入口,先校验登录状态和用户等级再读文件;文件移出 web 根目录,通过内部重定向发送;退出登录后直接请求下载地址,确认返回 403。
验收就看一点,未登录请求下载地址返回 403,登录会员才能拿到文件。
