我正在将Fire Base存储器用于连接到前端的应用程序。 我目前仅适用于存储分区文件夹的存储规则是:
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'));
}
我的意图是基于组ID授予读取访问权限,而基于用户ID给予写访问权限。 另外,在文件夹中-它仅应接受具有以下格式的图像-png / jpeg / jpg / webp / gif
但是,在尝试通过邮递员进行测试时-我能够添加ndjson文件或.py文件。 例如-API调用以-test.jpg结尾,但是在主体-二进制文件中,我正在添加.py文件。 此外,.py在存储中的类型为-image / jpg。
这将被添加到存储中。
如何限制仅从后端添加图像文件?
答案 0 :(得分:1)
uploading files上的文档最清楚如何确定contentType
:
putFile()
方法会自动从文件扩展名推断出MIME类型,但是您可以通过在元数据中指定contentType
来覆盖自动检测的类型。如果您未提供contentType
,并且Cloud Storage无法从文件扩展名推断默认值,那么Cloud Storage将使用application/octet-stream
。
因此Firebase不会不查看文件的实际内容来设置内容类型。
相反,内容类型是从文件扩展名派生的,您可以通过在上传文件时在元数据中显式设置内容类型来覆盖该内容类型。
由于您未设置元数据,因此内容类型由文件名中的.jpg
扩展名确定。无需使用Python内容来确定。
如果要更严格地检查内容类型,请考虑运行在上载时触发的Cloud Function,并使用文件类型嗅探器查看文件的实际内容以验证类型。然后,如果文件的内容与文件的类型不匹配,则可以将其删除,例如,将verified
属性添加到元数据中,然后可以在客户端中检入。
答案 1 :(得分:0)
我找到了一种验证here的方法。这对您有帮助吗?