我正在使用Firestore创建一个react本机应用程序,我不知道如何在文档创建和更新时实现安全的架构验证。
如果我了解安全规则,就有可能:
- 限制谁可以对文档执行操作(更新、读取、写入等(
- 基于字段条件限制允许的操作
- 基于自定义函数限制允许的操作(带示例的帖子(
我担心的是,由于请求的客户端性质,精明的用户可以利用他们的身份验证和一些客户端代码来.set((任何字段或将/对象映射到他们想要的任何值,除非安全规则阻止它。看来我可以使用非常复杂的自定义函数来验证收到的数据。我还可以通过云函数API验证每个更新和创建,但我正在尽可能使用Firestore数据库本身。
我担心用户在授权文档(即具有最小userId规则的文档(上滥用.set((字段创建能力的可能性是对的吗?
是否有一种公认的方法来创建安全规则,以防止客户端滥用没有验证架构的自定义函数的文档?
无论您是在安全规则中还是在云函数中更传统的代码中编写验证,都应该始终考虑恶意用户,以及他们可能如何影响您的数据。
比较你的问题中的这两个陈述:
- "我可以使用非常复杂的自定义函数来验证收到的数据">
- "我还可以通过云功能API验证每次更新和创建。">
在这两种情况下,您都在编写自定义代码,以确保用户输入的数据根据您的业务规则有效。由于这些规则是特定于您的业务的,因此无法阻止您必须编写它们。唯一的区别是在哪里编写这些业务规则。使用云函数,您可以在您可能已经熟悉的环境中用常规JavaScript代码编写验证。有了安全规则,您就可以用特定于领域的语言编写验证,这是您必须学习的。
我个人更喜欢将我的业务规则写入Firestore的服务器端安全规则语言,然后使用云函数在经过验证的数据之上实现业务逻辑。
如果您担心用户可能只是对您的应用程序进行逆向工程,并破坏您的代码以损害您的数据库,那么是的,这是可能的。你应该制定适当的规则。谈到从应用程序更新数据库中的数据,尽可能通过云功能进行更新。这样,您可能需要减少用户直接访问数据库的权限。
你可以在这里查看我的答案。这将帮助您设置规则和一些根据情况对应用程序代码进行代码调整的方法。答案还有一些关于在哪里可以使用云功能来减少与数据库的直接接触的内容。
如果不知道或者您觉得应该直接将信息更新到数据库中,请将规则更改为:".write": "$uid === auth.uid"
。这里$uid
是父节点的名称,可以是其他任何名称。这样,用户只能访问他/她的数据,即使用户修改了你的应用程序,他们也只能损害他们的数据。(您应该设置正确的规则(。
您可以查看此链接了解大多数规则组合。
请检查上面链接的答案。这可能会在一定程度上澄清它将如何保护您的数据库。如果你能提供关于你的应用程序的任何特定情况,并想要一些关于如何在那里设置规则的信息,请随时发表评论:-(