【问题标题】:Firebase authentication persistenceFirebase 身份验证持久性
【发布时间】:2019-07-03 05:58:42
【问题描述】:

我了解 Firebase 中有一个 setPersistence 方法来保持用户的会话。但是,我想知道使用 sessionStorage 中存储的数据的正确方法是什么。 在我的应用程序中,成功登录后,我调用了 setPersistence 方法。然后在主组件中,我有私有路由,我将在其中加载请求的组件或重定向,基于我在 sessionStorage 中检查的身份验证状态。

我想知道这是否安全。难道没有人可以通过手动添加键/值来轻松破解它吗?

我是否应该添加额外的检查以确保 sessionStorage 中的数据是预期的数据?处理这个问题的正确方法是什么?

【问题讨论】:

    标签: firebase firebase-authentication local-storage


    【解决方案1】:

    不要使用客户端检查来实施访问控制。无论使用何种浏览器持久性,这些都只是表面检查。唯一安全的方法是强制检查是通过传递登录用户的 ID 令牌并验证它在服务器端进行。 Firebase Admin SDK 提供 API 来帮助解决这个问题。或者,如果您使用 Firebase 安全规则,则会自动为您完成检查。如果恶意用户绕过客户端检查,用户数据(存储在您的服务器上或通过 Firebase RTDB 或 Firestore 存储)将仍然无法访问。

    基本上,永远不要依赖客户端检查来验证用户身份验证状态。

    【讨论】:

    • 谢谢@bojeil。这就是我一直在寻找的答案。那么在这种情况下将用户会话存储在浏览器存储中的目的是什么?在不影响安全的情况下有什么用处?
    • Firebase Auth 提供的客户端持久性用于其他目的。例如,sessionStorage 只会在当前窗口中保持会话,即使用户忘记退出,当用户关闭窗口时会话也会被清除。另一方面,localStorage 是跨标签共享的,并且会在浏览器重启等时持久化。
    【解决方案2】:

    你说得对,它不是很安全。 localStorage 旨在成为更高级的 cookie 替代品(某种)。它主要用作基本键值对的快速和持久存储,以帮助一般应用程序/网站运行。

    问问自己:您真的想在 cookie 中存储敏感的用户信息吗?

    你的回答很可能是NO。与localStorage 相同。但是,localStorage 只能由创建它的同一来源访问,这增加了一定程度的安全性。任何只想窃取重要信息的人都可以轻松绕过这种微小的安全级别。如果对安全性(CORS 等)没有给予足够的重视,也可以通过跨站点脚本轻松访问。

    话虽如此,如今许多应用都广泛使用它来存储登录信息,例如访问令牌和其他关于用户的“部分敏感”信息。但是,所有这些信息都会由后端的某个服务器进行交叉验证以检查其真实性。

    如果已经有一个系统(无论是内置在 Firebase 中还是由您使用云功能自定义构建)来检查从 localStorage 检索到的特定用户的真实性,并且单独使用该信息没有人可以访问敏感的用户信息,那么这不是问题。

    难道没有人可以通过手动添加键/值来轻松破解它吗?

    是的,虽然不像一开始看起来那么简单,但这确实是可能的。

    我是否应该添加额外的检查以确保 sessionStorage 中的数据是预期的数据?处理这个问题的正确方法是什么?

    根据信息的类型及其真实性对您、用户或您的应用程序运行的重要性,您可能希望也可能不希望建立一个检查系统。

    可能的解决方案:一种可能的解决方案是使用某种加密将数据存储到localStorage,例如 AES,并带有用于加密的密钥(加密密钥 ) 安全地存储在服务器上或只为用户所知。

    重要提示:永远不要在localStorage 中存储超级重要和私人信息,例如信用卡/借记卡号、密码等,无论您多么绝望或如何“安全”你认为你的应用程序/网站是。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2018-04-18
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      相关资源
      最近更新 更多