初窥CSRF攻击方式以及Flask-WTF

2024-02-09 09:48
文章标签 flask csrf 攻击方式 wtf

本文主要是介绍初窥CSRF攻击方式以及Flask-WTF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

含义

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

解释

在这里插入图片描述这幅图非常形象的解释了CSRF原理的具体过程。

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1. 登录受信任网站A,并在本地生成Cookie。
  2. 在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

  1. 你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

  2. 你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了…)

  3. 上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

flask 中的CSRF保护

Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心。尽管如此,如果你有不包含表单的视图,那么它们仍需要额外的保护。
例如,由 AJAX 发送的 POST 请求,并没有通过表单。在 0.9.0 之前版本,你无法获得 CSRF 令牌。这就是为什么我们编写了 CSRF 模块。

实现

要对所有视图函数启用 CSRF 保护,你需要启用 CsrfProtect 模块:

from flask_wtf.csrf import CsrfProtectCsrfProtect(app)

与任何其它的 Flask 扩展一样,你可以惰性加载它:

from flask_wtf.csrf import CsrfProtectcsrf = CsrfProtect()def create_app():app = Flask(__name__)csrf.init_app(app)

如果模板中有表单,你不需要做任何事。与之前一样:

<form method="post" action="/">{{ form.csrf_token }}
</form>

但如果模板中没有表单,你仍需要 CSRF 令牌:

<form method="post" action="/"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>

无论何时未通过 CSRF 验证,都会返回 400 响应。你可以自定义这个错误响应:

@csrf.error_handler
def csrf_error(reason):return render_template('csrf_error.html', reason=reason), 400

我们强烈建议你对所有视图启用 CSRF 保护。但也提供了将某些视图函数除外的途径:

@csrf.exempt
@app.route('/foo', methods=('GET', 'POST'))
def my_handler():# ...return 'ok'

参考

https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://docs.jinkan.org/docs/flask-wtf/csrf.html

这篇关于初窥CSRF攻击方式以及Flask-WTF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693873

相关文章

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

表单验证(WTF)

官方文档 在Flask项目开发中针对提交表单的校验,可以使用Flask-WTF扩展库进行快速的字段校验,也可以进行页面快速渲染,并提供跨站请求伪造的保护功能。 安装Flask-WTF pip install flask-wtf 实现注册功能 注册表单模型定义 在定义的表单类中定义需要验证的username、password和password2字段,并实现如下校验: 校验密码passw

【python web】Flask+Echarts 实现动图图表

flask 是python web开发的微框架,Echarts酷炫的功能主要是javascript起作用,将两者结合起来,发挥的作用更大。下面将Echarts嵌套进Flask的html模板中。 项目结构: 打开demo.py运行,点击console中的链接http://127.0.0.1:5000/ 就可以看到我们想要的动态图表。 demo.py #coding:utf-8fro

Flask-Session扩展,使用Redis存储会话数据

深入理解Flask-session扩展Redis Flask 应用中使用 flask-session 扩展将 session 数据存储在 Redis 中是一种高效且可扩展的方法,特别是在需要处理大量用户或需要分布式部署的应用中。以下是如何在 Flask 应用中配置 flask-session 以使用 Redis 存储 session 的步骤: 1. 安装必要的库 首先,你需要安装 Flask

Flask:Python轻量级Web框架详解

Flask是一个用Python编写的轻量级Web应用框架。它被设计为易于使用和扩展,非常适合小型项目和微服务,同时也能够支持大型应用。Flask依赖于少量的外部库,并且提供了一个简单的方式来创建Web应用。 Flask的主要特点 轻量级:Flask核心非常简单,使得它易于理解和扩展。扩展性:Flask可以通过扩展来增加额外的功能。灵活性:Flask允许你以任何你喜欢的方式组织你的应用。微核心设

如何处理Flask中的路由

在Flask框架中,路由是Web应用的核心组成部分之一,它定义了URL路径与视图函数之间的映射关系。当用户通过浏览器访问特定的URL时,Flask会根据定义的路由规则找到对应的视图函数,并调用该函数来处理请求,最后返回响应给客户端。处理Flask中的路由涉及定义路由、动态路由、路由参数、路由装饰器、蓝图等多个方面。由于直接撰写5000字详细阐述这些内容可能过于冗长,我将提供一个简明而全面的概述,并

Flask中 blinker 是什么

在Flask框架中,blinker 是一个非常重要的组件,它作为信号处理的库,为Flask应用提供了一种灵活而强大的事件处理机制。以下是对Flask中blinker的详细阐述,考虑到篇幅限制,无法直接达到5000字,但会尽量全面而深入地介绍其关键方面。 一、blinker 简介 blinker 是一个基于Python的轻量级信号库,它允许开发者在Python应用程序中实现观察者模式(也称为发布

常见PHP框架CSRF防范方案分析

什么是CSRF CSRF(跨站请求伪造)是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。网上有很多相关介绍了,具体攻击方式就不细说了,下面来说说Laravel和Yii2是如何来做CSRF攻击防范的。 Laravel CSRF防范 本次对Laravel CSRF防范源码的分析是基于5.4.36版本的,其他版本代码可能有所不同,但原理是相似的。 Laravel通过中间件

【网络安全】Self XSS + 文件上传CSRF

未经许可,不得转载。 文章目录 正文发现反射点实现XSS跨站请求伪造 (CSRF) 与文件上传结合POC 正文 在目标网站 target.com 的“联系我们”表单中,我注意到一个文件上传选项。 我最初输入了一个随机字符串,如 123xss,结果发现服务器没有对这个字符串进行足够的处理,比如转义或过滤,而是将其直接反射到网页中并展示给用户。 于是,我尝试注入XSS