Firebase 存储安全规则

Posted

技术标签:

【中文标题】Firebase 存储安全规则【英文标题】:Firebase Storage Security Rules 【发布时间】:2021-01-03 01:32:33 【问题描述】:

我正在为连接到前端的应用程序使用火基存储。 我目前仅存储桶文件夹的存储规则是:

match groupID/userId/image 
        allow read: if isValidProvider() && request.auth.token.groupId == groupID && request.auth.uid == userId;
        allow write: if isValidProvider() && request.auth.uid == userId &&  request.auth.token.groupId== groupID && isImageValid() && isValidImageExtension(image);
      
      

功能如下:

function isImageValid()
    return (request.resource.contentType.matches('image/png') ||
        request.resource.contentType.matches('image/jpg') ||
        request.resource.contentType.matches('image/jpeg') ||
        request.resource.contentType.matches('image/webp') ||
          request.resource.contentType.matches('image/gif'));
        
  



  function isValidImageExtension(image) 
  return (image.matches('.*[.]png') || 
      image.matches('.*[.]jpeg') ||
      image.matches('.*[.]jpg') ||
      image.matches('.*[.]webp')||
      image.matches('.*[.]gif'));
  

我的意图是基于 groupID 的读取权限和基于用户 ID 的写入权限。 此外,在文件夹中 - 它应该只接受格式为 - png/jpeg/jpg/webp/gif 的图像

但是,在尝试通过邮递员进行测试时 - 我可以添加 ndjson 文件或 .py 文件。 例如 - API 调用以 -test.jpg 结尾,但在正文 - 二进制文件中,我添加了一个 .py 文件。 此外,在存储中,.py 保存为类型 - image/jpg。

这正在被添加到存储中。

如何限制只从后端添加图片文件?

【问题讨论】:

实现此目的的最佳方法是在将文件放入 Firebase 存储之前进行后端文件类型验证。为什么要使用 firebase 规则来处理这个问题? 我们一直计划使用后端文件验证 - 但想了解是否可以通过规则实现相同的目标。那将是一个快速的解决方案。否则,后端验证将需要大量架构更改。 您能否编辑您的问题以显示您如何上传文件? 嗨 @FrankvanPuffelen 我的 API 调用类似于 - https://$API_URL2%2Ftest.jpg 然后在正文中 - 我转到二进制文件并添加 .py 文件。它给了我成功响应 200 OK。此外,我的存储桶中添加了相同的 py 文件。理想情况下,我希望被规则阻止。由于 contentType 验证。 【参考方案1】:

uploading files 上的文档最清楚地说明了如何确定 contentType

putFile() 方法自动从文件扩展名推断 MIME 类型,但您可以通过在元数据中指定 contentType 来覆盖自动检测到的类型。如果您不提供contentType,并且 Cloud Storage 无法从文件扩展名推断默认值,则 Cloud Storage 使用application/octet-stream

所以 Firebase 确实查看文件的实际内容来设置确定内容类型。

相反,内容类型是从文件扩展名派生的,您可以在上传文件时通过在元数据中显式设置内容类型来覆盖它。

由于您没有设置元数据,因此内容类型由文件名中的.jpg 扩展名确定。 Python 内容不用于确定。


如果您想要更严格地检查内容类型,请考虑运行在上传时触发的云函数,并使用文件类型嗅探器查看文件的实际内容来验证类型。然后,如果文件的内容与其类型不匹配,您可以删除该文件,或者例如将 verified 属性添加到您可以签入客户端的元数据中。

【讨论】:

你能推荐任何文件类型嗅探器的例子吗?是像clamAV还是别的什么? 建议异地库是题外话,这就是为什么我没有包括任何。但是搜索应该会给你合理的选择:google.com/search?q=node.js+type+sniffer 嗨@Frankvanpuffelen - 感谢您的帮助。我之前无法检查。【参考方案2】:

我找到了验证here 的方法。这对您有帮助吗?

【讨论】:

这是用于实时数据库 - 我们正在为 firebase 存储工作。 我也发现了这个。 firebase.google.com/docs/storage/security#data_validation

以上是关于Firebase 存储安全规则的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 存储安全规则

为特定用户提供访问权限的 Firebase 存储安全规则

Firebase 存储安全规则,允许公共或所有者私有文件访问

群组的 Firebase 存储安全规则

Firebase 存储安全规则不适用于文件夹

Firebase 存储安全规则和上传文件的下载令牌