OWASP 关于本地存储的建议仍然有效吗?

信息安全 Web应用程序 owasp 本地存储
2021-08-09 12:04:27

我目前正在开发一个应用程序,它是一个使用 Angular 构建的单页应用程序。它使用 HSTS 通过 HTTPS 提供服务。

对于身份验证,我们使用 Auth0。Auth0 文档建议将访问令牌存储在本地存储中。

然后使用拦截器将其添加到每个 HTTP 请求的标头中。

但是,此答案建议不要使用本地存储存储任何敏感信息。

答案来自 2011 年,作者还共同撰写了 OWASP HTML5 备忘单,其中指出:

请特别注意 HTML5 页面中实现的“localStorage.getItem”和“setItem”调用。它有助于检测开发人员何时构建将敏感信息放入本地存储的解决方案,这是一种不好的做法。

我想知道 2017/2018 年的情况是否发生了变化。我可以遵循 Auth0 的指导方针,还是应该采取其他方法?

4个回答

只要您对用户不必在会话之间重新进行身份验证感到满意,就个人而言,我认为使用本地存储没有问题。链接的答案提供了以下反对这一论点。我认为它非常弱-

底层存储机制可能因用户代理而异。换句话说,您的应用程序所需的任何身份验证都可以被对存储数据的机器拥有本地权限的用户绕过。因此,建议不要在本地存储中存储任何敏感信息。

这适用于任何类型的身份验证令牌。具有管理员权限的本地人(假设它没有使用与用户凭据相关的密钥进行加密)可以从任何类型的存储、RAM 甚至可能直接从网络中读取它。

他还建议——

(或网站中的 XSS 漏洞)

同样——这适用于 JavaScript 可以访问的任何类型的令牌。

本地存储被认为不安全的原因是因为在页面上下文中执行的任何 JavaScript 都可以访问它。这使您面临通过反射型 XSS 和存储的 XSS 漏洞进行会话劫持的风险,这可能会导致信息泄露,具体取决于您的令牌的内容。

例如:如果用户访问与其他用户共享内容的页面并且存在存储的 XSS 漏洞,则另一个用户可以注入攻击,该攻击将从本地存储中窃取您的令牌。

短期到期仅保护您的令牌免受重放攻击 - 但如果存在可访问 localstorage 的 XSS 漏洞,这将对活动会话没有影响,因为您可以编写轮询机制以在到期时再次从本地存储中提取令牌

我建议您使用 cookie 作为令牌的存储。

  • Cookie 只能标记为 HTTP。这将阻止 JavaScript 访问 cookie
  • 在服务器上让您的代码从 cookie 中提取令牌,然后对其进行验证
  • 也将其标记为仅对 HTTPS 安全

对不起,没有足够的分数来回应,所以把这个放在这里:

另一个考虑因素,您的威胁模型是什么?网络上的外部攻击者:将令牌存储在服务器上的 cookie 进程中 同一台机器上的用户(非管理员):可能是会话存储,所以没有持久性 本地管理员:没什么 - 他们是本地管理员,他们拥有系统

客户端认证对于作为用户的 Web 应用程序来说并不是一个真正可行的身份验证部分 - MFA 身份验证器是更好的选择

按照auth0 博客的建议,您可以通过保持较低的令牌过期值来解决安全问题,更重要的是,您可以加密令牌。

另一种方法是使用与 OAuth2 关联的 JSON Web 令牌。

我不是100%进入安全性。我从中读到了别的东西。

“敏感令牌信息”的问题是同样的问题,无论是 cookie 还是 localStorage。

但是您可以将更多数据保存到本地存储中,这可能会带来这样的想法,即存储所有银行信息、所有转账等是个好主意(请插入其他有风险的信息。医疗、司法、... ) 到本地存储,因此您可以离线访问它。

cookie 或会话的安全风险通过服务器端的会话超时来缓解。但是本地存储没有超时。因此,如果您将任何内容存储在本地存储中,请做好准备,它会永远留在那里。如果您不希望有权访问机器的每个人都能够阅读它 - 请确保将其删除并确保您的机制在“每种情况下”都有效(无论这在本地存储环境中意味着什么 - 恕我直言,这是不可能的。但我是一个php开发人员,请纠正我。)