Local storage 使用JSON Web令牌的CSRF保护

Local storage 使用JSON Web令牌的CSRF保护,local-storage,csrf,jwt,auth0,Local Storage,Csrf,Jwt,Auth0,我了解到,当使用JWT时,不需要防止CSRF攻击,例如:“” 但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我所建议的那样),如何防止攻击者通过读取我的localStorage而不是cookie来伪造恶意请求 由于它是在服务器端生成的,我不知道如何在客户端请求中使用令牌,而不将其存储在客户端的某个位置。严格来说,是的,本地/会话存储(我称之为HTML5存储)中存储的任何内容都可能在跨站点脚本(XSS)攻击中被盗。看 有很多可移动的部分要考虑,但是 首先,关于JavaSc

我了解到,当使用JWT时,不需要防止CSRF攻击,例如:“”

但是,有一点我不明白:如果我将令牌存储在localStorage中(正如我所建议的那样),如何防止攻击者通过读取我的localStorage而不是cookie来伪造恶意请求


由于它是在服务器端生成的,我不知道如何在客户端请求中使用令牌,而不将其存储在客户端的某个位置。

严格来说,是的,本地/会话存储(我称之为HTML5存储)中存储的任何内容都可能在跨站点脚本(XSS)攻击中被盗。看

有很多可移动的部分要考虑,但是

首先,关于JavaScript访问,HTML5存储和Cookie的范围存在细微的差异

HTML5存储是:

  • 分为http和https。存储在
    http://example.com
    HTML5存储无法通过运行在
    https://example.com
  • 在子域之间划分。存储在
    http://example.com
    HTML5存储无法通过运行在
    http://sub.example.com
    (不过,您可以采取一些措施来解决这个问题)
曲奇饼更松散,更粘:

  • 带有域
    example.com
    的cookie将同时转到这两个
    http://example.com
    https://example.com
    除非它具有属性
    secure
    ,在这种情况下,它将只发送到
    https
  • 未与显式域一起发送的cookie将只发送回发送它的确切域。如果域被明确定义为
    example.com
    ,那么它将被发送到
    example.com
    sub.example.com
    。(不幸的是,这是cookie“规范”中最令人困惑的部分,请参见)
  • 如果cookie运行在具有匹配域的页面上(并且遵守
    安全
    cookie标志),则JavaScript可以读取cookie,除非cookie具有
    httpOnly
    属性,在这种情况下,JavaScript将无法读取cookie
其次,由于Cookie带有域标记,因此当向服务器发出请求时,浏览器将发送所有且仅发送具有匹配域的Cookie,而不管发起请求的页面的域是什么

最后一部分是如何完成CSRF攻击(同源策略仅起到了很大的作用)。是学习此类攻击如何工作的良好资源

将身份验证令牌存储在本地存储器中并手动将其添加到每个请求中以防止CSRF的原因在于关键字:manual。由于浏览器不会自动发送该身份验证令牌,如果我访问
evil.com
,它会发送
帖子http://example.com/delete-my-account
,它将无法发送我的authn令牌,因此请求将被忽略

考虑到上述情况,使用cookie还是HTML5存储成为一系列权衡:

将authen令牌存储在HTML5存储中意味着:

  • (-)
    它在XSS攻击中被盗的风险
  • (+)
    提供CSRF保护
  • (-)
    必须手动修改发送到服务器的每个请求,从而限制您使用SPA(例如AngularJs)web应用程序
另一方面,如果将authn令牌存储在标记为
httpOnly
secure
的cookie中,则:

  • (+)
    XSS无法窃取authn令牌
  • (-)
    您必须自己提供CSRF保护。在某些框架中实现CSRF保护比在其他框架中更容易
哪种选择更好取决于您的需要

  • 您的authn令牌是否保护与金钱有关的内容?您可能需要cookie
    httpOnly
    secure
    选项
  • 实施CSRF保护所需的努力水平是否不值得其保护的资产?那么HTML5存储可能就是合适的地方了

使用基于令牌的身份验证时,必须手动将令牌与请求关联。与Cookie相反,浏览器不会自动设置令牌,因此不易受到
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存储规范