无法基于元数据设置Firebase Storage访问规则 跨用户上传被拒
Firebase Storage 跨用户路径写入权限被拒修复方案
根因
你规则里用的resource对象指向的是存储中已经存在的目标文件,新文件上传时目标路径还没有对应实体,此时resource为null,resource.metadata.owner的判断在新建文件场景下根本不会生效,自然会返回权限拒绝。
而且你当前的规则还有严重安全隐患:就算是更新已有文件,也没有对写入的元数据做校验,任意用户都可以篡改owner字段把别人的文件据为己有。
修复逻辑
写入场景下校验上传携带的元数据,必须使用request.resource对象——这个对象代表本次写入完成后将要生成的文件实体,包含用户本次上传传入的所有元数据、内容属性。
修正后的完整规则:
service firebase.storage { match /b/{bucket}/o { match /{userId}/{allPaths=**} { // 读权限:路径所属用户、文件所有者可访问 allow read: if request.auth != null && (request.auth.uid == userId || resource.metadata.owner == request.auth.uid); // 写权限分场景校验,堵上越权漏洞 allow write: if request.auth != null && ( // 1. 用户在自己的UID路径下写入 request.auth.uid == userId || // 2. 跨路径写入必须同时满足要求 ( // 本次上传携带的owner字段必须是当前登录用户本人,禁止伪造身份 request.resource.metadata.owner == request.auth.uid // 如果是覆盖已有文件,原文件所有者必须是当前用户,防止篡改他人文件 && (resource == null || resource.metadata.owner == request.auth.uid) ) ); } } }
关键规则概念区分
resource:仅用于校验存储中已存在的文件属性,读、删、更新已有文件场景下使用request.resource:用于校验本次请求提交的文件内容/元数据,所有新建、覆盖上传的场景必须用这个对象做写入校验- 涉及自定义元数据的权限判断,必须强制校验元数据值和当前登录用户ID绑定,不能允许用户任意传入元数据值,否则会出现越权漏洞
内容的提问来源于stack exchange,提问作者Ashish Bansal
相关产品推荐
相关产品推荐

