【问题标题】:Firebase Storage Security RulesFirebase 存储安全规则
【发布时间】: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 验证。

标签: firebase security google-cloud-platform firebase-storage firebase-security


【解决方案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 的方法。这对您有帮助吗?

【讨论】:

猜你喜欢
  • 2020-07-03
  • 2020-03-24
  • 2016-09-27
  • 2022-01-18
  • 2021-09-21
  • 2017-08-02
  • 2020-10-24
  • 2020-10-30
相关资源
最近更新 更多