You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法基于元数据设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:30:43