【发布时间】:2021-02-02 20:50:29
【问题描述】:
CSRF,代表 Cross-Site Request Forgery,是一种攻击 针对攻击者试图欺骗的 Web 应用程序 经过身份验证的用户执行恶意操作。大多数 CSRF 攻击针对使用基于 cookie 的身份验证的 Web 应用程序,因为 Web 浏览器包括与特定 每个请求的域。因此,当从 相同的浏览器,攻击者可以很容易地利用存储的cookies。
我决定使用 Flask-Session,这是一个 Flask 扩展,可以简单地集成服务器端缓存,将用户会话数据存储在服务器中。
使用这个扩展(将用户会话存储在redis上)足以防止CSRF攻击?
【问题讨论】:
-
不,不是,这不是 CSRF 所做的。
-
感谢您的回答@MartijnPieters。我真的很感激。
-
请注意,这并不是 Flask 特定的。 CSRF 使用户向服务器发出他们无意提出的请求。服务器假定他们正在与合法用户交谈,并且该请求是有意的。假设您使用会话来识别银行网站的登录用户。如果攻击者可以欺骗用户将资金转移到另一个帐户,那么会话数据的存储位置就无关紧要了。
-
例如,攻击者可以在 HTML 电子邮件中发送图像,但图像的链接实际上是银行网站的链接。如果用户已经登录到银行站点,并因此将 cookie 从浏览器发送到站点,Flask-Session 扩展仍然使用该 cookie 来识别要加载的 Redis 中的数据。无论如何,请求看起来都来自用户。
-
CSRF 保护使用 网页中的额外数据,这些数据必须匹配附加到用户帐户且在浏览器页面之外不可用的信息,并且每次加载可能触发敏感请求的页面时都会发生变化。这样,服务器至少知道请求来自刚刚发送给用户的特定浏览器页面。外部攻击者无法获得 CSRF 的“校验和”值,因此由于 CSRF 校验和丢失或错误,因此电子邮件中的图像链接技巧将不起作用。