Local storage 使用JSON Web令牌的CSRF保护
我了解到,当使用JWT时,不需要防止CSRF攻击,例如:“” 但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我所建议的那样),如何防止攻击者通过读取我的localStorage而不是cookie来伪造恶意请求Local storage 使用JSON Web令牌的CSRF保护,local-storage,csrf,jwt,auth0,Local Storage,Csrf,Jwt,Auth0,我了解到,当使用JWT时,不需要防止CSRF攻击,例如:“” 但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我所建议的那样),如何防止攻击者通过读取我的localStorage而不是cookie来伪造恶意请求 由于它是在服务器端生成的,我不知道如何在客户端请求中使用令牌,而不将其存储在客户端的某个位置。严格来说,是的,本地/会话存储(我称之为HTML5存储)中存储的任何内容都可能在跨站点脚本(XSS)攻击中被盗。看 有很多可移动的部分要考虑,但是 首先,关于JavaSc
由于它是在服务器端生成的,我不知道如何在客户端请求中使用令牌,而不将其存储在客户端的某个位置。严格来说,是的,本地/会话存储(我称之为HTML5存储)中存储的任何内容都可能在跨站点脚本(XSS)攻击中被盗。看 有很多可移动的部分要考虑,但是 首先,关于JavaScript访问,HTML5存储和Cookie的范围存在细微的差异 HTML5存储是:
- 分为http和https。存储在
HTML5存储无法通过运行在http://example.com
https://example.com
- 在子域之间划分。存储在
HTML5存储无法通过运行在http://example.com
(不过,您可以采取一些措施来解决这个问题)http://sub.example.com
- 带有域
的cookie将同时转到这两个example.com
和http://example.com
除非它具有属性https://example.com
,在这种情况下,它将只发送到secure
https
- 未与显式域一起发送的cookie将只发送回发送它的确切域。如果域被明确定义为
,那么它将被发送到example.com
和example.com
。(不幸的是,这是cookie“规范”中最令人困惑的部分,请参见)sub.example.com
- 如果cookie运行在具有匹配域的页面上(并且遵守
安全
cookie标志),则JavaScript可以读取cookie,除非cookie具有
属性,在这种情况下,JavaScript将无法读取cookiehttpOnly
evil.com
,它会发送帖子http://example.com/delete-my-account
,它将无法发送我的authn令牌,因此请求将被忽略
考虑到上述情况,使用cookie还是HTML5存储成为一系列权衡:
将authen令牌存储在HTML5存储中意味着:
它在XSS攻击中被盗的风险(-)
提供CSRF保护(+)
必须手动修改发送到服务器的每个请求,从而限制您使用SPA(例如AngularJs)web应用程序(-)
httpOnly
和secure
的cookie中,则:
XSS无法窃取authn令牌(+)
您必须自己提供CSRF保护。在某些框架中实现CSRF保护比在其他框架中更容易(-)
- 您的authn令牌是否保护与金钱有关的内容?您可能需要cookie
httpOnly
选项secure
- 实施CSRF保护所需的努力水平是否不值得其保护的资产?那么HTML5存储可能就是合适的地方了
csrf
攻击
虽然这种方法不受csrf
攻击,但容易受到xss
攻击
最简单的改进是使用
会话存储
而不是本地存储
,因为会话存储
数据会在用户关闭选项卡/浏览器后被清除。答案很好。我现在比以前更害怕了。是时候仔细检查我应用程序中的每个文本输入字段了。首先,同一来源可以防止读取/查看数据,但不能防止提交请求。如果我错了,请更正。@Zack evil.com无法访问example.com的web存储或cookies,因此evil.com无法获取有效的auth/CSRF令牌。但是,对于所有请求,cookie都会自动提交到服务器,即使它们是从evil.com发送的。如果会话令牌是cookie,则还需要提供CSRF令牌。但是,如果会话令牌位于本地存储中,则必须“手动”将其添加到每个请求中,浏览器将不会为您执行此操作。如果Javascript将令牌添加为自定义头,那就更好了,因为SOP不允许使用自定义头的跨源请求。@Zack但是,我不确定这有多实际,因为只要指向站点上另一个页面的简单链接,单击时就不会发送会话令牌。这就是我试图通过说您仅限于“SPA(如AngularJs)web应用程序”来表达的意思。我不能100%确定链接问题的解决方法。@Zack在evil.com上运行的JavaScript如何访问example.com的web存储?它不能。web存储规范