我正在尝试为使用Firebase存储的应用程序保护图像。
当前我的存储层次结构为bucket/{userId}/{UUID.jpg}
上传每张图片时,我将文件路径写入 Firestore
写入使用Auth
和Firebase Storage Security Rules
allow write: if request.auth.uid == userId
&& request.resource.size < 2 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
读取访问仅限于所有经过身份验证的用户。客户端使用iOS上的 FirebaseUI 通过内置的SDWebImage功能访问图像
allow read: if request.auth != null;
最终我的主要问题是:用公共/私人用户保护社交网络图像的最佳方法是什么?如果您没有答案,请直接进入问题#2
我当前的read
访问安全规则十分脆弱。
我正在做的事情比使用Download URLs稍好,因为这些信息可以传递给任何设备上的任何人,以下载图像。
但是,只要拥有登录用户名的身份,任何具有私人用户userId的不良演员都可以读取该私人用户的任何图像。
选项1 -我希望能够使用追随者列表(在Firestore中)来保护谁可以读取存储桶/文件夹中的对象(就像在Firestore安全规则中一样),但是似乎你做不到(因为没有人回应)。
Limit Google Cloud Storage Access to Followers (stored in Firestore)
选项2 -如果我保持与现在相同的结构,是否可以认为它相对安全?它依赖于晦涩。即使该人拥有私人用户的userId
(因此可以在Cloud Storage中找到该文件夹),该人仍需要确切的文件名才能下载该图像。
但是,如果人们可以列出Cloud Storage文件夹中的所有对象,这一切都会崩溃
是否可以列出某个Cloud Storage文件夹中的所有对象?
弗兰克·范·普菲伦(Frank van Puffelen)在previous question中表示,Firebase Storage没有用于列出文件夹中对象的 API 。
Firebase Storage中目前没有API调用可列出所有文件 在文件夹中。
但是还有其他更直接的访问方式,例如 GCS JSON API 吗?
https://cloud.google.com/storage/docs/json_api/v1/objects/list
例如使用上面的存储桶层次结构。 privateUserXYZ有一个包含所有图像的文件夹(randomString1.jpg,randomString2.jpg,randomString3.jpg等)
不好的演员可以使用privateUserXYZ的userId并列出其文件夹中的所有图像(然后下载它们)吗?
OR
他们是否需要猜测privateUserXYZ的每个字符串才能下载图像?因此,使用更长的字符串更好(以防止暴力破解)?