本地存储-使用JSON Web令牌的CSRF保护

我读到使用JWT时,无需防御CRSF攻击,例如:“由于您不依赖Cookie,因此无需防御跨站点请求”。

但是,我不了解:如果将令牌存储在localStorage中(正如我在同一网站的教程中所建议的那样),那么如何防止攻击者通过读取localStorage而不是cookie来伪造恶意请求?

由于它是在服务器端生成的,因此,如果不将令牌存储在客户端的某个位置,我将无法使用令牌来处理客户端请求。

JulienD asked 2020-07-26T19:02:09Z
2个解决方案
98 votes

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

但是,有很多移动部件要考虑。

首先,在JavaScript访问方面,HTML5存储和cookie的范围存在细微的差异。

HTML5存储是:

  • 分为http和https。 运行在secure上的JavaScript无法访问存储在httpOnly HTML5存储中的项目。
  • 在子域之间划分。 运行在secure上的JavaScript无法访问存储在httpOnly HTML5存储中的项目(但是,您可以采取一些技巧来解决此问题)。

Cookie更加松散:

  • 域为httpOnly的cookie会同时访问securesub.example.com,除非它具有secure属性,在这种情况下,它将仅发送到https
  • 未使用显式域发送的Cookie将仅发送回发送它的确切域。 如果该域被明确定义为httpOnly,则它将同时发送到298386887295841111777和sub.example.com。(不幸的是,这是cookie“ spec”中最令人困惑的部分,请参阅本文)。
  • 如果cookie在具有匹配域的页面上运行(并遵守httpOnly cookie标志),则JavaScript可以读取JavaScript,除非该cookie具有secure属性,在这种情况下,JavaScript将无法读取它。

其次,由于cookie标记有域,因此,当向服务器发出请求时,浏览器将发送具有匹配域的所有cookie,而与发出请求的页面的域无关。

最后一部分是CSRF攻击的完成方式(同源策略只能起到很大作用)。 CSRF上的OWASP页面是学习此类攻击如何工作的好资源。

关键字:手动是将身份验证令牌存储在本地存储中并手动将其添加到每个请求中的原因,可以防止CSRF。 由于浏览器不会自动发送该身份验证令牌,因此如果我访问httpOnly并且它设法发送secure,它将无法发送我的身份验证令牌,因此该请求将被忽略。

考虑到以上几点,是使用cookie还是HTML5存储成为一系列的权衡:

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

  • httpOnly在XSS攻击中被盗的风险。
  • httpOnly提供CSRF保护。
  • httpOnly必须手动修改发送到服务器的每个请求,将您限制为SPA(例如AngularJs)Web应用程序。

另一方面,如果您将身份验证令牌存储在标记为httpOnlysecure的cookie中,则:

  • httpOnly XSS无法窃取身份验证令牌。
  • httpOnly您将必须自己提供CSRF保护。 在某些框架中,实施CSRF保护要容易得多。

哪个选项更好取决于您的需求。

  • 您的验证令牌可以保护与金钱无关的任何东西吗? 您可能需要使用Cookie httpOnly secure选项。
  • 实施CSRF保护所需的工作水平是否不值得其保护的资产? 然后,HTML5存储可能是正确的位置。
kuporific answered 2020-07-26T19:04:13Z
1 votes

使用基于令牌的身份验证时,必须手动将令牌与请求关联。 与cookie相反,浏览器不会自动设置令牌,因此不易受到session storage攻击。

尽管此方法对于session storage攻击是安全的,但它容易受到local storage攻击。

最小的努力改进将是使用session storage而不是local storage,因为session storage在用户关闭标签/浏览器后会清除数据。

senjin.hajrulahovic answered 2020-07-26T19:04:42Z
translate from https://stackoverflow.com:/questions/35291573/csrf-protection-with-json-web-tokens