Flask中请求体的请求开启CSRF保护可以按以下配置

  from flask_wtf.csrf import CSRFProtect

  app.config.from_object(Config)

  CSRFProtect(app)

但CSRFProtect只做验证工作,cookie中的 csrf_token 和表单中的 csrf_token 需要按以下方式实现

理清思路

根据 csrf_token 校验原理,具体操作步骤有以下几步:

  1. 后端生成 csrf_token 的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种:

    • 在模板中的 From 表单中添加隐藏字段
    • 将 csrf_token 使用 cookie 的方式传给前端
  2. 在前端发起请求时,在表单或者在请求头中带上指定的 csrf_token
  3. 后端在接受到请求之后,取到前端发送过来的 csrf_token,与第1步生成的 csrf_token 的值进行校验
  4. 如果校验对 csrf_token 一致,则代表是正常的请求,否则可能是伪造请求,不予通过

而在 Flask 中,CSRFProtect 这个类专门只对指定 app 进行 csrf_token 校验操作,所以开发者需要做以下几件事情:

  • 生成 csrf_token 的值
  • 将 csrf_token 的值传给前端浏览器
  • 在前端请求时带上 csrf_token 值

完成代码逻辑

  • 生成 csrf_token 的值
  # 导入生成 csrf_token 值的函数
  from flask_wtf.csrf import generate_csrf
  # 调用函数生成 csrf_token
  csrf_token = generate_csrf()
  • 将 csrf_token 的值传给前端浏览器

    • 实现思路:可以在请求勾子函数中完成此逻辑
  @app.after_request
  def after_request(response):
  # 调用函数生成 csrf_token
  csrf_token = generate_csrf()
  # 通过 cookie 将值传给前端
  response.set_cookie("csrf_token", csrf_token)
  return response
  • 在前端请求时带上 csrf_token 值

    • 根据登录和注册的业务逻辑,当前采用的是 ajax 请求
    • 所以在提交登录或者注册请求时,需要在请求头中添加 X-CSRFToken 的键值对
  $.ajax({
  url:"/passport/register",
  type: "post",
  headers: {
  "X-CSRFToken": getCookie("csrf_token")
  },
  data: JSON.stringify(params),
  contentType: "application/json",
  success: function (resp) {
  if (resp.errno == "0"){
  // 刷新当前界面
  location.reload()
  }else {
  $("#register-password-err").html(resp.errmsg)
  $("#register-password-err").show()
  }
  }
  })
 

Falsk项目cookie中的 csrf_token 和表单中的 csrf_token实现的更多相关文章

  1. 在HTML文件的表单中添加{%csrf_token%}便可以解决问题

    原因是django为了在用户提交表单时防止跨站攻击所做的保护 只需在HTML文件的表单中添加{%csrf_token%}便可以解决问题 ------------------------if判断{% i ...

  2. HTML 中按钮作为form表单元素提交特性两则 --- 参HTML考标准分析

    相同name的submit 类型的input提交行为 描述 这种情况, <input type="submit" name="ACTION" value= ...

  3. laravel 项目表单中有csrf_token,但一直报错419错误 解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persi

    laravel 项目表单中有csrf_token,但一直报错419错误,因为项目中使用到Redis缓存,在强制关闭Redis后出现的问题,查询laravel.log文件查找相关问题 安装redis后在 ...

  4. 基于Vue的工作流项目模块中,使用动态组件的方式统一呈现不同表单数据的处理方式

    在基于Vue的工作流项目模块中,我们在查看表单明细的时候,需要包含公用表单信息,特定表单信息两部分内容.前者表单数据可以统一呈现,而后者则是不同业务的表单数据不同.为了实现更好的维护性,把它们分开作为 ...

  5. J2EE项目开发中常用到的公共方法

    在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...

  6. Django中ORM系统多表数据操作

    一,多表操作之增删改查 1.在seting.py文件中配置数据库连接信息 2.创建数据库关联关系models.py from django.db import models # Create your ...

  7. django系列9--django中的组件(form表单)

    modelform整体 from django import forms from app01 import models import hashlib from django.core.except ...

  8. Django基础(三)_分页器、COOKIE与SESSION、FORM表单

    分页器(paginator) 分页器的使用 >>> from django.core.paginator import Paginator >>> objects ...

  9. SSH实战 · 唯唯乐购项目(中)

    用户模块 三:一级分类的查询 创建一级分类表并导入基本数据 CREATE TABLE `category` (   `cid` int(11) NOT NULL AUTO_INCREMENT,   ` ...

随机推荐

  1. C++之MFC基本设置

    1 设置单元格的值 1) 选中指定单元格,使用SetValue设置值 CellName.Format(_T("A%d"),i);//单元格的名称 range.AttachDispa ...

  2. Spark高级数据分析· 2数据分析

    wget https://archive.ics.uci.edu/ml/machine-learning-databases/00210/donation.zip 数据清洗 cd /Users/eri ...

  3. 【c++ primer, 5e】构造函数 & 拷贝、赋值和析构

    [构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码 ...

  4. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

  5. excel省市区三级分类级联

    前言:同事正好需要一个这样的地址类型给用户使用下载模板,改好地址再导入,这样就不会出现地址不匹配问题.所以就自己也整理了一套,以备不时之需. 效果展示: 图一:省级 图二:市级 图三:区级 图四:各乡 ...

  6. SaltStack本地管理无master模式-第八篇

    Salt本地管理应用场景 1.在边缘节点服务器非常少没有Salt-master 2.零售店,电影院等弱网络环境没有Salt-master 3.快速部署单个服务没有Salt-master 实现 一,安装 ...

  7. maven(一)maven自带的插件

    关于org.apache.maven.plugins 前言 maven提供了很多插件给我们使用,解释3个java环境常用的maven插件, maven-jar-plugin, maven-compli ...

  8. [Network Architecture]DPN(Dual Path Network)算法详解(转)

    https://blog.csdn.net/u014380165/article/details/75676216 论文:Dual Path Networks 论文链接:https://arxiv.o ...

  9. RabbitMQ入门(2)——工作队列

    前面介绍了队列接收和发送消息,这篇将学习如何创建一个工作队列来处理在多个消费者之间分配耗时的任务.工作队列(work queue),又称任务队列(task queue). 工作队列的目的是为了避免立刻 ...

  10. Dll Hijacker

    #coding=utf-8 # # Dll Hijacker # # platform: Python 2.x @ Windows # # author:Coca1ne import os,sys,t ...