我目前正在使用 ReactJS 构建一个单页应用程序。
我读到不使用的原因之一localStorage
是因为 XSS 漏洞。
由于 React 会转义所有用户输入,现在使用它是否安全localStorage
?
我目前正在使用 ReactJS 构建一个单页应用程序。
我读到不使用的原因之一localStorage
是因为 XSS 漏洞。
由于 React 会转义所有用户输入,现在使用它是否安全localStorage
?
在大多数现代单页面应用程序中,我们确实必须将令牌存储在客户端的某个地方(最常见的用例 - 保持用户在页面刷新后登录)。
共有 2 个选项可用:Web 存储(会话存储、本地存储)和客户端 cookie。这两个选项都被广泛使用,但这并不意味着它们非常安全。
Tom Abbott 很好地总结了JWT sessionStorage 和 localStorage 安全性:
Web Storage (localStorage/sessionStorage) 可以通过 JavaScript 在同一个域中访问。这意味着在您的站点上运行的任何 JavaScript 都可以访问 Web 存储,因此可能容易受到跨站点脚本 (XSS) 攻击。简而言之,XSS 是一种漏洞,攻击者可以在其中注入将在您的页面上运行的 JavaScript。基本的 XSS 攻击尝试通过表单输入注入 JavaScript,攻击者将其
<script>alert('You are Hacked');</script>
放入表单中,以查看它是否由浏览器运行并可以被其他用户查看。
为了防止 XSS,常见的响应是对所有不可信数据进行转义和编码。React(大部分)为你做这件事!这里有一个很好的讨论,关于 React 负责多少 XSS 漏洞保护。
但这并不能涵盖所有可能的漏洞!另一个潜在威胁是使用托管在 CDN 或外部基础设施上的 JavaScript。
汤姆又来了:
现代网络应用程序包括用于 A/B 测试、漏斗/市场分析和广告的 3rd 方 JavaScript 库。我们使用像 Bower 这样的包管理器将其他人的代码导入我们的应用程序。
如果只有您使用的脚本之一遭到破坏怎么办?恶意 JavaScript 可以嵌入到页面中,并且 Web 存储会受到损害。这些类型的 XSS 攻击可以在每个人不知情的情况下获取访问您站点的每个人的 Web 存储。这可能就是为什么许多组织建议不要在网络存储中存储任何有value的东西或信任任何信息的原因。这包括会话标识符和令牌。
因此,我的结论是,作为一种存储机制,Web Storage在传输过程中不会强制执行任何安全标准。阅读并使用 Web Storage 的任何人都必须尽职尽责,以确保他们始终通过 HTTPS 而不是 HTTP 发送 JWT。
我知道这是一个老问题,但根据@mikejones1477 所说的,现代前端库和框架逃避了文本,为您提供了针对 XSS 的保护。cookie 不是使用凭证的安全方法的原因是当 localStorage 阻止时 cookie 不会阻止 CSRF(还请记住,javascript 也可以访问 cookie,所以这里的 XSS 不是大问题),这个答案恢复了为什么。
将身份验证令牌存储在本地存储中并手动将其添加到每个请求以防止 CSRF 的原因是关键字:手动。由于浏览器不会自动发送该身份验证令牌,如果我访问 evil.com 并设法发送 POST http://example.com/delete-my-account,它将无法发送我的身份验证令牌,所以请求被忽略。
当然,httpOnly 是圣杯,但你不能从 reactjs 或任何 js 框架访问,你仍然有 CSRF 漏洞。我的建议是 localstorage 或者如果您想使用 cookie,请确保像 django 那样对您的CSRF 问题实施一些解决方案。
关于 CDN,请确保您没有使用一些奇怪的 CDN,例如像 google 或 bootstrap 提供的 CDN,由社区维护并且不包含恶意代码,如果您不确定,您可以自由查看。
基本上可以将 JWT 存储在 localStorage 中。
我认为这是一个好方法。如果我们谈论的是 XSS、使用 CDN 的 XSS,那么这也是获取客户登录/通行证的潜在风险。将数据存储在本地存储至少可以防止 CSRF 攻击。
您需要了解两者并选择您想要的。这两种攻击并不是您需要注意的全部,请记住:您的整个应用程序仅与应用程序中最不安全的点一样安全。
再次存储是可以的,容易受到 XSS、CSRF、...不是
如果您使用 CDN 是不安全的:
恶意 JavaScript 可以嵌入到页面中,并且 Web 存储会受到损害。这些类型的 XSS 攻击可以在每个人不知情的情况下获取访问您站点的每个人的 Web 存储。这可能就是为什么许多组织建议不要在网络存储中存储任何有value的东西或信任任何信息的原因。这包括会话标识符和令牌。
通过风暴路径
您需要从外部获取的任何脚本都可能遭到破坏,并且可能会从您客户端的存储中获取任何 JWTS 并将个人数据发送回攻击者的服务器。
Localstorage 设计为可通过 javascript 访问,因此它不提供任何 XSS 保护。正如其他答案中所提到的,有很多可能的方法可以进行 XSS 攻击,默认情况下,本地存储不受保护。
但是,cookie 具有安全标志,可以防止 XSS 和 CSRF 攻击。HttpOnly 标志阻止客户端 javascript 访问 cookie,Secure 标志只允许浏览器通过 ssl 传输 cookie,SameSite 标志确保 cookie 只发送到源。虽然我刚刚检查过,目前只有 Opera 和 Chrome 支持 SameSite,所以为了防止 CSRF,最好使用其他策略。例如,在另一个 cookie 中发送一个带有一些公共用户数据的加密令牌。
因此 cookie 是用于存储身份验证数据的更安全的选择。