2

我正在制作一个带有 JWT 身份验证的 Django Rest Framework 应用程序,其令牌存储在 HttpOnly cookie 中。身份验证是通过读取accesscookie 来执行的。我dj-rest-auth为此目的使用了一个库,但我对这种方法的安全方面有点困惑。知道将身份验证数据存储在 cookie 中可用于执行 CSRF 攻击,对于我上面描述的特定情况,如何保护他们的网络免受此类攻击?所有 cookie 都设置为SameSite=Lex.

我是否还需要发送X-CSRFTOKEN从后端获得的标头?这意味着对 api 的每个请求都需要具有该标头。拥有所有这些库的最佳设置应该是什么?

4

2 回答 2

1

OWASP 基金会创建了一份关于如何防止 CSRF 攻击的详细备忘单:https ://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

有两件事值得记住:

  • CSRF 只关注数据更改请求,因此 POST/PUT/PATCH/DELETE 方法。执行 CSRF 攻击的攻击者无法读取服务器的响应,因此 GET 请求不是您关心的问题。

  • 防止 CSRF 的最常见方法是使用 csrf 令牌。服务器应该为用户的会话创建令牌,并且令牌保存在前端,但保存在cookie 中。然后,您可以在标头中或作为请求正文的一部分发送该令牌。然后,服务器验证该令牌是否与该用户会话的令牌相同。

如果您不想将令牌保留在服务器中,则可以另外将其保存在 cookie 中。所以前端会将令牌保存在两个地方 - 一个在内存中/在隐藏的表单字段中/等。另一个在饼干里。然后服务器可以检查 cookie 中的值是否与 header/body 中的值匹配。

于 2022-01-20T09:01:24.190 回答
1

所有 cookie 都设置为 SameSite=Lex。

我是否还需要发送从后端获得的 X-CSRFTOKEN 标头?

SameSite旧浏览器不支持。根据caniuse,全球 90% 的浏览器都支持它。

反对实施 CSRF 令牌的论点:

  • 我认为这是一个低风险。如果你认为你的用户会在这 90% 中,那么就不要理会 CSRF 代币。
  • 由于您使用的是 JWT,我假设前端将是一个现代 SPA 应用程序。如果您不希望它在较旧的浏览器上运行,那么再一次,不要打扰 CSRF 令牌。

实现 CSRF 令牌的参数:

  • Lax对 GET 请求不提供任何保护。无论是现在还是将来,您都必须确保永远不会在 GET 请求中修改服务器状态。如果您实施 CSRF 令牌,您将少担心一件事。或者你也可以SameSite=Strict使用价值。

我的意见:

就个人而言,我只是实现 CSRF 令牌。这是一次性设置,大多数框架已经处理了这一点。那么,为什么不呢?


PS:我不确定你是否有错字,但它是Lax,不是Lex

于 2022-01-21T15:01:58.097 回答