Flask-Session(服务器端缓存)——CSRF攻击

Flask- Session (server-side cache) - CSRF attacks

来自testdriven.io

CSRF, which stands for Cross-Site Request Forgery, is an attack against a web application in which the attacker attempts to trick an authenticated user into performing a malicious action. Most CSRF attacks target web applications that use cookie-based auth since web browsers include all of the cookies associated with a particular domain with each request. So when a malicious request is made from the same browser, the attacker can easily make use of the stored cookies.

我决定使用 Flask-Session,这是一个 Flask 扩展,可以简单地集成服务器端缓存,将用户会话数据存储在服务器中。

使用此扩展(将用户会话存储在 redis 上)是否足以防止 CSRF 攻击?

不,Flask-Session 不能防止 CSRF 攻击,因为 CSRF 攻击不依赖于 session 身份验证,它依赖于 pre-existing 之间的连接浏览器和您的网站。 Flask-Session 不会删除用户浏览器与您的 session 数据之间的连接,仅在存储与用户关联的 session 数据的位置。

Flask-Session 可以让您做的只是隐藏您与给定用户关联的信息,不让外界看到。但是您仍然需要能够区分用户 A 和用户 B,因此 浏览器中仍然有一个 cookie,它告诉您的 Flask 服务器要从 [=51] 加载什么数据=] 该用户。没有 Flask-Session,任何 session 数据都存在于浏览器中,而 Flask-Session 只为浏览器提供一个唯一标识符。

CSRF 攻击不需要知道 session 中存储了什么,只需要 session 存在 。 CSRF 攻击在以下情况下起作用:

  • 用户可能会被诱骗向站点发送请求以执行对攻击者有利的操作
  • 用户已经登录到该网站,因此该网站会看到执行所需操作的请求是从已经过身份验证的客户端发送的。

您通过要求每个执行有价值的请求都带有一个秘密的 CSRF 令牌来减轻 CSRF 攻击,该令牌未存储在 session 中。浏览器不得保留 CSRF 值,因此以后永远不会使用 CSRF 令牌。您改为将令牌放在页面的 HTML 或其他请求和响应 headers 中。这样服务器不仅可以相信他们有一个经过身份验证的用户,而且请求是 新鲜的并且不是由无法访问浏览器的攻击者生成的 .

如果您使用 WTForm 生成表单,请使用 Flask-WTF CSRF functionality 确保请求来自新网页。您甚至可以在不使用表单时使用它们的 API,例如使用 AJAX 调用或 hand-crafted 表单时。

您可能需要阅读 OWASP CSRF prevention page 以进一步了解 CSRF 攻击的工作原理。