Flask框架——CSRF保护
目录
- CSRF攻击
- 如何防御CSRF攻击
- Flask框架中的CSRF保护机制
CSRF攻击
CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。
CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。
包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…
造成的问题:个人隐私泄露以及财产安全。
攻击示意图:
如何防御CSRF攻击
csrf_token服务器内部校验过程:
表单提交
1.在表单中携带,隐藏的csrf_token,加密的 (自己设置)
2.在cookie中,设置一个sessionID (服务器设置)
在提交的时候,服务器校验过程:
(1)取出表单中的csrf_token, 使用SECRET_KEY,进行解密, 得到未加密的csrf_token
(2)通过sessionID取出,服务器内部的session空间中的,未加密的csrf_token,比较二者的值是否相等,如果相等则校验通过
非表单提交, ajax提交
1.在headers中设置csrf_token,加密的 (自己设置), 来自于cookie中的 (我们自己设置的)
2.在cookie中,设置一个sessionID (服务器设置)
在提交的时候,服务器校验过程:
(1)取出headers中的csrf_token, 使用SECRET_KEY,进行解密, 得到未加密的csrf_token
(2)通过sessionID取出,服务器内部的session空间中的,未加密的csrf_token,比较二者的值是否相等,如果相等则校验通过
Flask框架中的CSRF保护机制
csrf_token: 为了解决跨站请求伪造,⽽定义的变量
flask中提供了模块flask_wtf⾥⾯提供了⼀个类CSRFProtect来保护
使⽤流程:
1.导⼊模块: from flask_wtf import CSRFProtect
2.使⽤CSRFProtect(app), 保护应⽤程序
3.在表单中,使⽤csrf_token(), ⾃动⽣成⼀个csrf_token值,并且这个值是加密的,需要设置
SECRET_KEY
4.csrfprotect保护的时候对以下请求⽅式做校验:‘POST’, ‘PUT’, ‘PATCH’, ‘DELETE’
代码实现:
在html模板文件中表单提交里需要加上一个隐藏的字段csrf_token
from flask import Flask,render_template,request
from flask_wtf import CSRFProtectapp = Flask(__name__)app.config["SECRET_KEY"] = "fjdkfkdjfdk"CSRFProtect(app)@app.route('/')
def index():return render_template("file08index.html")@app.route('/register',methods=["POST"])
def register():#1.获取参数username = request.form.get("username")password = request.form.get("password")repassword = request.form.get("repassword")#2.校验,为空校验if not all([username,password,repassword]):return "参数填写不完整"#3.密码需要一致if password != repassword:return "密码不一致"return "注册成功"if __name__ == '__main__':app.run(debug=True)
具体实现方法(手动添加):
@app.route('/', methods=["POST", "GET"])
def index():if request.method == "POST":# 取到表单中提交上来的参数username = request.form.get("username")password = request.form.get("password")if not all([username, password]):print('参数错误')else:print(username, password)if username == 'laowang' and password == '1234':# 状态保持,设置用户名到cookie中表示登录成功response = redirect(url_for('transfer'))response.set_cookie('username', username)return responseelse:print('密码错误')return render_template('temp_login.html')#转账页面
@app.route('/transfer', methods=["POST", "GET"])
def transfer():# 从cookie中取到用户名username = request.cookies.get('username', None)# 如果没有取到,代表没有登录if not username:return redirect(url_for('index'))if request.method == "POST":to_account = request.form.get("to_account")money = request.form.get("money")# 取到表单中的tokenform_csrf_token = request.form.get('csrf_token')# cookie中的tokencookie_csrf_token = request.cookies.get('csrf_token', "")# 做校验。如果校验成功,再进行转账逻辑if form_csrf_token != cookie_csrf_token:return "你是坏蛋,非法请求"print('假装执行转账操作,将当前登录用户的钱转账到指定账户')return '转账 %s 元到账号 %s 成功' % (money, to_account)csrf_token = generate_csrf()# 渲染转换页面,表单中设置csrf_tokenresponse = make_response(render_template('temp_transfer.html', csrf_token=csrf_token))# 往cookie中添加csrf_tokenresponse.set_cookie('csrf_token', csrf_token)return response# 生成 csrf_token
def generate_csrf():return bytes.decode(base64.b64encode(os.urandom(48)))if __name__ == '__main__':app.run(debug=True, port=9000)
Flask框架——CSRF保护相关推荐
- python前端学习-------Flask框架基础(建议收藏)
Flask框架基础 下载并安装Flask框架 Flask基础 第一个Flask应用 开启调试模式 路由 变量规则 构造URL HTTP方法 模板 语法格式 模板变量 控制结构 条件控制语句 `if` ...
- flask框架学习笔记
flask_day01 pycharm创建项目,连接到远程gitee仓库,创建仓库flask_study,分支helloworld, 自带第一个程序"helloworld",运行程 ...
- python flask框架下登录注册界面_Python-用户登录 Flask-Login
用户登录功能是 Web 系统一个基本功能,是为用户提供更好服务的基础,在 Flask 框架中怎么做用户登录功能呢?今天学习一下 Flask 的用户登录组件 Flask-Login Python 之所以 ...
- Flask框架——消息闪现
目录 使用消息闪现 消息闪现分类 过滤闪现消息 上篇文章我们学习了Flask框架--flask-caching缓存,这篇文章我们来学习Flask框架--flash消息闪现. 良好的web应用程序中需要 ...
- Flask框架面试题
文章目录 1.什么是Flask,有什么优点? 2.Flask-WTF是什么,有什么特点? 3.Flask脚本的常用方式是什么? 4.如何在Flask中访问会话? 5.解释Python Flask中的数 ...
- Python学习十二:Flask框架
文章目录 一.Flask 简介 1.1 安装虚拟环境 1.1.1 安装Virtualenv 1.1.2 创建虚拟环境 1.1.3 激活虚拟环境 1.2 安装Flask 1.3 第一个Flask 二.F ...
- Flask框架学习整理——从零开始入门Flask
文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...
- 万文爆肝╭❤~零基础学Flask框架,速速收藏不然就不见了
文章目录 认识Flask Flask 了解框架 为什么要用Web框架 Flask框架的诞生 Flask扩展包 安装环境 安装Flask 安装Flask依赖包 视图 从 Hello World 开始 扩 ...
- ajax头文件报错,AJAX的CSRF保护
如果使用ajax传输数据,需要在AJAX中要使用csrf保护. 一般而言,即在后端已经使用了CSRFProtect(app)的前提下, 如果想使用ajax,避免400的报错,可以前端的表单里引入标签, ...
最新文章
- BZOJ 2456 : mode
- 深入理解JavaScript系列(5):强大的原型和原型链
- SQL语句来查询今天、昨天、7天内、30天的数据,经典!
- python 求系数矩阵,关于numpy:python-如何在数据矩阵中使用nans计算相关矩阵
- spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件
- SharedPreferences详解
- [转]linux下完全备份数据库mysql
- Objective-C:内存管理的小结
- linux蜂鸣器驱动指令,linux蜂鸣器驱动 蜂鸣器--LINUX.doc
- [置顶] MySQL -- 创建函数(Function
- WGestures鼠标手势快捷手势介绍
- FPGA状态机跑飞 的解决办法
- DRM框架梳理-- dumb-buffer的分配和绑定到crtc
- Google 2020 应用与游戏出海 12 月刊: 年终盘点特辑
- 微信小程序中实现地图导航
- 天津医科大学计算机研究生吧,天津医科大学
- 【UPCOJ】10155问题 S: 近似排序
- java中equals合if的用法_java中的equals和==
- oracle 修改jobs执行时间,oracle JOB常见的执行时间
- cl不是内部或外部命令