目录

  • 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保护相关推荐

  1. python前端学习-------Flask框架基础(建议收藏)

    Flask框架基础 下载并安装Flask框架 Flask基础 第一个Flask应用 开启调试模式 路由 变量规则 构造URL HTTP方法 模板 语法格式 模板变量 控制结构 条件控制语句 `if` ...

  2. flask框架学习笔记

    flask_day01 pycharm创建项目,连接到远程gitee仓库,创建仓库flask_study,分支helloworld, 自带第一个程序"helloworld",运行程 ...

  3. python flask框架下登录注册界面_Python-用户登录 Flask-Login

    用户登录功能是 Web 系统一个基本功能,是为用户提供更好服务的基础,在 Flask 框架中怎么做用户登录功能呢?今天学习一下 Flask 的用户登录组件 Flask-Login Python 之所以 ...

  4. Flask框架——消息闪现

    目录 使用消息闪现 消息闪现分类 过滤闪现消息 上篇文章我们学习了Flask框架--flask-caching缓存,这篇文章我们来学习Flask框架--flash消息闪现. 良好的web应用程序中需要 ...

  5. Flask框架面试题

    文章目录 1.什么是Flask,有什么优点? 2.Flask-WTF是什么,有什么特点? 3.Flask脚本的常用方式是什么? 4.如何在Flask中访问会话? 5.解释Python Flask中的数 ...

  6. Python学习十二:Flask框架

    文章目录 一.Flask 简介 1.1 安装虚拟环境 1.1.1 安装Virtualenv 1.1.2 创建虚拟环境 1.1.3 激活虚拟环境 1.2 安装Flask 1.3 第一个Flask 二.F ...

  7. Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...

  8. 万文爆肝╭❤~零基础学Flask框架,速速收藏不然就不见了

    文章目录 认识Flask Flask 了解框架 为什么要用Web框架 Flask框架的诞生 Flask扩展包 安装环境 安装Flask 安装Flask依赖包 视图 从 Hello World 开始 扩 ...

  9. ajax头文件报错,AJAX的CSRF保护

    如果使用ajax传输数据,需要在AJAX中要使用csrf保护. 一般而言,即在后端已经使用了CSRFProtect(app)的前提下, 如果想使用ajax,避免400的报错,可以前端的表单里引入标签, ...

最新文章

  1. BZOJ 2456 : mode
  2. 深入理解JavaScript系列(5):强大的原型和原型链
  3. SQL语句来查询今天、昨天、7天内、30天的数据,经典!
  4. python 求系数矩阵,关于numpy:python-如何在数据矩阵中使用nans计算相关矩阵
  5. spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件
  6. SharedPreferences详解
  7. [转]linux下完全备份数据库mysql
  8. Objective-C:内存管理的小结
  9. linux蜂鸣器驱动指令,linux蜂鸣器驱动 蜂鸣器--LINUX.doc
  10. [置顶] MySQL -- 创建函数(Function
  11. WGestures鼠标手势快捷手势介绍
  12. FPGA状态机跑飞 的解决办法
  13. DRM框架梳理-- dumb-buffer的分配和绑定到crtc
  14. Google 2020 应用与游戏出海 12 月刊: 年终盘点特辑
  15. 微信小程序中实现地图导航
  16. 天津医科大学计算机研究生吧,天津医科大学
  17. 【UPCOJ】10155问题 S: 近似排序
  18. java中equals合if的用法_java中的equals和==
  19. oracle 修改jobs执行时间,oracle JOB常见的执行时间
  20. cl不是内部或外部命令

热门文章

  1. 索引-python编程技术-第二版
  2. 记一次Git pull之后Permission denied的解决方案
  3. Facebook黄毅博士:像加工艺术品一样构建技术产品
  4. 聊聊FilterSecurityInterceptor
  5. Android 6.0 设备强制要求开启全盘加密
  6. [译]编写高性能对垃圾收集友好的代码
  7. Android Calender
  8. 生产环境Nginx配置文件
  9. 我的nginx+php是如何配置的?
  10. 重复包含定义 导致未定义类型不识别错误