我正在AWS上开发一个无服务器应用程序,并使用Svelte.js和Sapper开发一个静态前端。对于用户管理,我使用AWS认知用户池。认知在执行auth操作时返回JWT令牌,因此这自然会导致在何处存储这些令牌的客户端的异常问题。
我读过使用localStorage vs cookie的各种利弊,以及第一个选项如何打开XSS漏洞,而第二个选项易受CSRF攻击。我知道恶意脚本可以很容易地访问localStorage,并且在那里存储诸如JWT这样的敏感信息是有风险的。我还理解使用HttpOnly可以阻止javascript对cookie的访问,因此它们应该对XSS攻击更加敏感。
但在阅读“OWASP预防CSRF指南”时,我发现了一个有趣的说法:
但是,任何跨站点脚本漏洞都可以用来击败当今市场上可用的所有CSRF缓解技术(除了涉及用户交互的缓解技术,并在本备忘表后面进行了描述).必须不存在任何XSS漏洞,以确保CSRF防御系统无法规避。
然而,同一指南中还有另一条声明指出:
请注意,令牌本身可以减轻CSRF。
这让我很困惑。到底是哪一个?除了用户交互之外,所有CSRF预防技术都是易受攻击的,还是基于令牌的技术是可以接受的?
如果它们是无效的,而且由于CSRF预防依赖于XSS预防,这难道不意味着在cookies中存储JWT比在localStorage中存储JWT几乎没有什么安全可言吗?如果我的应用程序中存在XSS漏洞,这不意味着我设置的任何CSRF防御实际上都是无用的吗?
如果是这样的话,那么当我一开始就需要防止XSS的时候,为什么还要经历处理cookie和CSRF预防的麻烦呢?
有人能帮我澄清一下这个问题吗?是否有一种方法可以正确地使用JWT而不暴露XSS攻击?基于令牌的技术(如同步器模式或加密模式)真的有效吗?
谢谢。
发布于 2019-10-31 22:26:00
我也试图了解Sapper应用程序的最佳安全实践。我在这里找到了一些关于使用标题的东西:https://github.com/sveltejs/sapper/issues/880
CSRF的更全面的一般分解:https://github.com/pillarjs/understanding-csrf
和一些更高级的概念链接在这里,通过盖茨比的讨论:https://github.com/gatsbyjs/gatsby/issues/14741
https://stackoverflow.com/questions/57517989
复制相似问题