-1

我正在开发一个使用 symfony 和 JWT 令牌进行身份验证的 Web 应用程序。为了防止 XSS,JWT 令牌存储在具有 HttpOnly 属性的 cookie 中。为了防止 CSRF,我使用了随机的 csrf 令牌。此令牌存储在 cookie 和 JWT 令牌(加密)中。我想知道的是,是否有必要在每个响应中更新 csrf 令牌?什么是最好的实现?

这是我的详细设置:

  • 我们有一个单页应用程序。大多数请求将使用 ajax 发送。
  • 用户使用 POST 进行身份验证。
  • 成功验证后,服务器将生成随机 csrf 令牌,然后将其存储在 cookie (HttpOnly) 和 JWT 有效负载中。在存储在 JWT 有效负载中之前,csrf 令牌将被加密。
  • JWT token 编码后会存储在cookies中(HttpOnly)
  • 每次用户请求访问另一个页面时,服务器将在 JWT 令牌解码时验证 cookie 和 JWT 令牌中的 csrf 令牌。
  • 未使用 LocalStorage,因为它可以通过 javascript 访问
4

1 回答 1

1

通常不需要在每次请求时更新 CSRF 令牌。

但是让我们看看在您的设置中会发生什么:

  • 您将 JWT 和 CSRF 令牌存储在 cookie 中,
  • 您访问的恶意网站会引发对您网站的恶意数据的恶意请求,
  • 您的浏览器使用 JWT+CSRF 将 cookie 附加到此请求,
  • 你的安全被打破了。

所以千万不要把 CSRF token 放在 cookie 里,因为不管你更新还是不更新都没用。

如果您使用“单页应用程序”,最好在Authorization标头中传递 JWT。这使得 CSRF 攻击成为不可能(注意其他威胁)。

如果您使用“经典 Web 应用程序”,最好使用“经典”CSRF 令牌和“经典”会话标识符。

于 2019-02-19T09:26:22.917 回答