security - 当 XSS 取消 CSRF 时,为什么将 API token 存储在建议用于 SPA 的 cookie 中

标签 security cookies local-storage single-page-application csrf

关于在典型的单页应用程序中存储 token 的安全方式(cookie 与本地存储)的文章很多,并且使用 cookie 通常是更好的选择。 [1] [2] [3]

原因是在本地存储session数据容易受到XSS攻击。 Cookie 有 CSRF 问题,但从文本来看,实现 CSRF 保护似乎不成问题。

但是,我无法想象 SPA 的 REST API 的 CSRF 保护不会受到 XSS 的攻击(除非我们谈论的是重新身份验证和验证码),甚至在 CSRF Prevention Cheat Sheet 中提到的 OWASP。 :

...any cross-site scripting vulnerability can be used to defeat all CSRF mitigation techniques available in the market today (except mitigation techniques that involve user interaction...

因此,如果 cookie 没有 XSS 问题但确实存在 CSRF 问题,但如果存在 XSS,CSRF 是无用的,为什么它们被认为是更好的选择?如果这不是真的,那么 CSRF 保护对 XSS 免疫的是什么?

最佳答案

说将身份验证 token 存储在 httpOnly cookie 中对 xss 是“免疫的”仅意味着不能通过 xss 访问 token 本身。这绝不意味着应用程序不会受到攻击。

如果应用程序容易受到 XSS 攻击(它仍然可以是 ofc),则可以在客户端访问任何内容,包括 csrf token ,或在客户端显示或处理的任何数据。只有 httpOnly cookie 中的登录/身份验证 token 是不可访问的,这意味着攻击者至少无法窃取 session 。但这远非 xss 安全。

关于security - 当 XSS 取消 CSRF 时,为什么将 API token 存储在建议用于 SPA 的 cookie 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239650/

相关文章:

javascript - 存储用户敏感 API 详细信息的安全方式(本地存储还是数据库?)

perl - 为什么 Perl `printf` 会改变我的 $variable 的值?

javascript - 将多变量 Cookie 解析为 Web 表单值

javascript - 在javascript中读取cookie,由asp.net c#code制作

javascript - 在浏览器中存储大量数据

javascript - 包含字符串的 getItem localstorage

security - 什么是跨站脚本?

JAVA - 如何从 sqlite 数据库存储和读取 RSA 公钥

node.js - 什么是 koa :sess. 信号?

javascript - HTML5 本地存储,刷新时显示保存日期