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 存储安全规则的主要内容,如果未能解决你的问题,请参考以下文章