我正在构建一个桌面应用程序并使用Firebase SDK。我正在用Firebase的实时数据库和存储服务做实验。实时数据库包含所有元数据,存储包含实际文件。
数据库方案如下:
-+ users/
|
+ -- + sd798f7a98dsf79879/ <-- user.uid
|
+ -- + projects/
|
+---- Project1/
| ...
+---- Project2/
...
存储方案看起来类似。在桌面应用程序中,我可以快速计算用户在存储中所有文件的总大小,因为这些信息存储在实时数据库中。如果一个用户想要上传超过他的计划允许的数据,我可以在客户端拒绝上传。
但这不是100%安全,因为这是一个可能被黑客攻击的客户端检查。如果有人可以暂时超过他的限制,我不会太担心,但我想确保我可以使用软限制和硬限制。
考虑到我在桌面应用程序中使用数据库的情况,您能推荐一种替代方法吗?
但这不是100%安全的,因为这是一个可能被黑客入侵的客户端检查。
这是真的。您不应该依赖客户端来更新此类数据。最简单的选择是使用云存储触发器的云功能,将更新数据库中图像的大小。
如果用户超过配额,如何阻止用户上传新文件?
最好的选择是将它们的总使用量存储在自定义声明中,并在Firebase存储安全规则中读取。像这样的规则应该起作用:
allow write: if request.resource.size + request.auth.token.size < 10 * 1024 * 1024;
该规则将只允许用户上传总计为10 MB
的文件。如果索赔尚未更新,则用户可以上传超过此限制的罕见情况
你可以看看我对类似问题的回答:
如何限制用户可以上传到Firebase存储的文件的总大小?
正如@FrankVanPuffelen所评论的那样,自定义声明需要时间来传播,并且可能允许用户上传超过指定的限制。您当然可以删除图像或撤销用户的刷新令牌(当前ID令牌仍然保持活跃),但这可能不利于用户体验。您还可以在用户试图上传任何文件之前直接从实时数据库读取总使用情况,以防止它们被上传。这仍然可以逆向工程
如果你需要强制执行这些限制而没有这样的缺点,最好通过云功能或服务器上传图像,如果用户超过配额,服务器将拒绝上传请求。