Flask-会话(服务器端缓存)-CSRF攻击

Flask-会话(服务器端缓存)-CSRF攻击,flask,redis,csrf,Flask,Redis,Csrf,从 CSRF代表跨站点请求伪造,是一种攻击 针对攻击者试图欺骗用户的web应用程序 通过身份验证的用户无法执行恶意操作。大多数CSRF 攻击的目标是使用基于cookie的身份验证的web应用程序 浏览器包括与特定浏览器关联的所有cookie 每个请求都包含一个域。因此,当用户发出恶意请求时 在同一浏览器中,攻击者可以轻松利用存储的cookie 我决定使用Flask Session,它是一个Flask扩展,支持服务器端缓存的简单集成,将用户会话数据存储在服务器中 使用此扩展将用户会话存储在redi

CSRF代表跨站点请求伪造,是一种攻击 针对攻击者试图欺骗用户的web应用程序 通过身份验证的用户无法执行恶意操作。大多数CSRF 攻击的目标是使用基于cookie的身份验证的web应用程序 浏览器包括与特定浏览器关联的所有cookie 每个请求都包含一个域。因此,当用户发出恶意请求时 在同一浏览器中,攻击者可以轻松利用存储的cookie

我决定使用Flask Session,它是一个Flask扩展,支持服务器端缓存的简单集成,将用户会话数据存储在服务器中


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

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

Flask会话允许您做的只是从外部隐藏与给定用户关联的信息。但是您仍然需要能够区分用户A和用户B,因此浏览器中仍然有一个cookie,它告诉您的Flask服务器从Redis为该用户加载哪些数据。没有Flask Session,任何会话数据都存在于浏览器中,而Flask Session仅为浏览器提供唯一标识符

CSRF攻击不需要知道会话中存储了什么,只需要知道会话存在。CSRF攻击在以下情况下有效:

用户可能会被诱骗向站点发送请求,以执行对攻击者有利的操作 用户已经登录到该站点,因此该站点会看到已通过身份验证的客户端发送的执行所需操作的请求。 通过要求每个执行有价值操作的请求都附带一个不存储在会话中的秘密CSRF令牌,可以减轻CSRF攻击。不允许浏览器保留CSRF值,因此以后它将永远不会使用CSRF令牌。而是将令牌放在页面的HTML或其他请求和响应头中。这样,服务器不仅可以信任他们拥有经过身份验证的用户,还可以信任该请求是新的,并且不是由未访问浏览器的攻击者生成的

如果使用WTForm生成表单,请使用确保请求来自新网页。您甚至可以在不使用表单时使用它们的API,例如,在使用AJAX调用或手工制作的表单时


您可能需要阅读,以进一步了解CSRF攻击是如何工作的。

不,它不是,CSRF不是这样做的。感谢您的回答@MartijnPieters。我真的很感激。请注意,这并不是很具体。CSRF让用户向服务器发出他们无意发出的请求。服务器假定他们正在与合法用户交谈,并且请求是有意的。比如说,您使用会话来识别银行网站的登录用户。如果攻击者可以诱骗用户将钱转移到另一个帐户,则会话数据存储在何处并不重要。例如,攻击者可以通过HTML电子邮件发送图像,但图像的链接实际上是指向银行网站的链接。如果用户已经登录到银行站点,并因此将cookie从浏览器发送到站点,Flask会话扩展仍然使用该cookie来标识要加载的Redis中的数据。不管怎样,请求似乎来自用户。CSRF保护在网页中使用额外数据,这些数据必须与附加到用户帐户的信息相匹配,而这些信息在浏览器页面之外不可用,并且在每次加载可能触发敏感请求的页面时都会发生更改。这样,服务器至少知道请求来自刚刚发送给用户的特定浏览器页面。外部攻击者无法获取该CSRF“校验和”值,因此电子邮件技巧中的图像链接无法工作,因为CSRF校验和丢失或错误。非常感谢@MartijnPieters。