Flask-WTF的CSRF保护详解_flask-wtf csrf-程序员宅基地

技术标签: CSRF  转载博客  Flask  

CSRF 保护

这部分文档介绍了 CSRF 保护。

为什么需要 CSRF?

Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心。尽管如此,如果你有不包含表单的视图,那么它们仍需要保护。

例如,由 AJAX 发送的 POST 请求,然而它背后并没有表单。在 Flask-WTF 0.9.0 以前的版本你无法获得 CSRF 令牌。这是为什么我们要实现 CSRF。

实现

为了能够让所有的视图函数受到 CSRF 保护,你需要开启 CsrfProtect 模块:

from flask_wtf.csrf import CsrfProtect

CsrfProtect(app)

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

from flask_wtf.csrf import CsrfProtect

csrf = CsrfProtect()

def create_app():
    app = Flask(__name__)
    csrf.init_app(app)

Note

你需要为 CSRF 保护设置一个秘钥。通常下,同 Flask 应用的 SECRET_KEY 是一样的。

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

<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'

默认情况下你也可以在所有的视图中禁用 CSRF 保护,通过设置 WTF_CSRF_CHECK_DEFAULT 为 False,仅仅当你需要的时候选择调用 csrf.protect()。这也能够让你在检查 CSRF 令牌前做一些预先处理:

@app.before_request
def check_csrf():
    if not is_oauth(request):
        csrf.protect()

AJAX

不需要表单,通过 AJAX 发送 POST 请求成为可能。0.9.0 版本后这个功能变成可用的。

假设你已经使用了 CsrfProtect(app),你可以通过 { { csrf_token() }} 获取 CSRF 令牌。这个方法在每个模板中都可以使用,你并不需要担心在没有表单时如何渲染 CSRF 令牌字段。

我们推荐的方式是在 <meta> 标签中渲染 CSRF 令牌:

<meta name="csrf-token" content="{
  { csrf_token() }}">

在 <script> 标签中渲染同样可行:

<script type="text/javascript">
    var csrftoken = "{
  { csrf_token() }}"
</script>

下面的例子采用了在 <meta> 标签渲染的方式, 在 <script> 中渲染会更简单,你无须担心没有相应的例子。

无论何时你发送 AJAX POST 请求,为其添加 X-CSRFToken 头:

var csrftoken = $('meta[name=csrf-token]').attr('content')

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken)
        }
    }
})

故障排除

当你定义你的表单的时候,如果犯了 `这个错误`_ : 从 wtforms 中导入 Form 而不是从 flask.ext.wtf 中导入,CSRF 保护的大部分功能都能工作(除了 form.validate_on_submit()),但是 CSRF 保护将会发生异常。在提交表单的时候,你将会得到 Bad Request/CSRF token missing or incorrect 错误。这个错误的出现就是因为你的导入错误,而不是你的配置问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq769747518/article/details/81583616

智能推荐

Docker部署Springboot项目连接到PostgreSQL_docker spring boot nacos连接postgresql数据库-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏8次。docker小白的学习笔记,将自己之前做的Springboot项目做成容器进行试验,新建的PG数据库并没有导入数据,但是此过程可用。一:部署 postgresql镜像。1:搜索postgresql镜像。docker search postgres;2:拉取postgres镜像docker pull postgres3:创建本地目录映射到容..._docker spring boot nacos连接postgresql数据库

SSL协议详解-程序员宅基地

文章浏览阅读3.2k次。SSL)是一个安全协议,为基于TCPTransmission Control Protocol)的应用层协议提供安全连接,SSL介于TCP/IP协议栈第四层和第七层之间。主要提供私密性、完整性和身份验证;我们常见的就是 SSL为HTTP)协议提供安全连接。SSL协议是一种在两个机器之间提供安全通道的协议,它具有保护数据传输以及识别通信机器的功能。内的愈来愈多的浏览器支持SSL,SSL协议成为应用最广泛的安全协议之一。_ssl协议

深圳杯&东三省联赛数学建模挑战赛2024C题_使用gcc中不同版本的c++编译器编译附件1中的程序源代码[2],并对比使用默认编译选-程序员宅基地

文章浏览阅读473次,点赞5次,收藏9次。编译器版本的识别问题作为一种重要的工具,电子计算机自诞生以来,经历了极为快速的发展。区区百年的时间内,无论从体积、能耗、计算速度,还是应用能力等方面,电子计算机都出现了极为显著的变化。但要充分利用这一工具,必须使用能够被电子计算机解释执行的指令序列,即程序。最早可用于在电子计算机上执行的程序通常使用机器语言(machine language)编制。由于该类语言并不直观,故它极大地限制了电子计算机的普及。为克服这一困难,1957年诞生了第一个自动编译器,FORTRAN。此后,大量性能更高并支持近乎自然语言的编_使用gcc中不同版本的c++编译器编译附件1中的程序源代码[2],并对比使用默认编译选

vue中切换背景颜色。_vue 页面中为什么不能调用$contrast-color:#fff;-程序员宅基地

文章浏览阅读2k次。beforeCreate: function() { if (document.getElementsByClassName("page")[0]) document.getElementsByClassName("page")[0].className = "page1"; }, beforeDestroy: function() { document.get..._vue 页面中为什么不能调用$contrast-color:#fff;

DEEPXDE_神经网络deepxde求解偏微分方程-程序员宅基地

文章浏览阅读6.6k次,点赞17次,收藏66次。近年来在深度学习在计算机视觉,自然语言等方面得到了广泛应用,尽管在这些和相关领域取得了显著的成功,但深度学习还没有广泛应用于科学计算领域,然而,最近,通过深度学习求解偏微分方程(PDEs),如标准微分形式或积分形式,已经成为科学机器学习下一个潜在的新的子领域;特别的,用一种近似于PDE解的神经网络来代替传统的数值离散方法_神经网络deepxde求解偏微分方程

第九讲 python中的常量-链式赋值-解包赋值-内置数据类型-基本算术运算符-程序员宅基地

文章浏览阅读35次。Python不支持常量,即没有语法规则限制改变一个常量的值。我们只能约定常量的命名规则,以及在程序的逻辑上不对常量的值作出修改。

随便推点

bootstrap-fileinput后端接收不到数据_动态人像抓拍比对系统架构(前端抓拍+网络传输+后端视频解析)...-程序员宅基地

文章浏览阅读103次。动态人像抓拍比对系统由前端人脸抓拍采集子系统、网络传输子系统和后端解析管理子系统组成,实现对通行人脸信息的采集、传输、处理、分析与集中管理。系统中,前端人脸采集设备负责人脸图像的采集,接入服务器主要实现图片及信息的接收和转发功能,可为多种型号、多个厂家的抓拍机提供统一接入服务,接收到的抓拍图片存入云存储单元,并由人脸结构化分析服务器对抓拍的视频及图像进行建模以及黑名单实时比对报警,建模得到的人脸信..._bootstrap fileinput request.form.files获取不到

抖音seo矩阵系统源码搭建步骤分享_云索seo矩阵系统-程序员宅基地

文章浏览阅读115次。抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统,其主要作用是通过一系列的技术手段,提高抖音视频的曝光和排名,使其获得更多的流量和粉丝。在本文中,我们将介绍抖音SEO矩阵系统的开发技术,包括系统设计、代码实现等方面。将源码上传到服务器上,并修改相关配置参数,包括数据库连接参数、域名配置、后台管理员账号等。从公开的代码托管网站上下载抖音SEO账号矩阵系统的源码,例如Github、码云等。将配置好的源码部署到Nginx服务器上,并设置网站的根目录指向源码的入口文件。并在网站上购买一个域名。_云索seo矩阵系统

国内顶级AI赛事再启程,第三届“中国人工智能大赛”聚焦算法治理、深度伪造与网络安全_第三届人工智能大赛网络安全赛道-程序员宅基地

文章浏览阅读813次。本届大赛赛题分为算法治理、深度伪造和网络安全三大方向的七大赛题,分别是:过滤算法鲁棒性、深度伪造视频检测、深度伪造视频生成方法识别、基于人工智能的音视频合成比赛、说话人无关的音频深度伪造检测识别、说话人相关的音频深度伪造检测识别、Webshell检测识别。编辑 | 宋慧出品 | CSDN近日,由国家互联网信息办公室、工业和信息化部、公安部、国家广播电视总局、厦门市人民政府联合主办,以“融新汇智,竞促发展”为主题的第三届中国人工智能大赛,在北京正式启动。大赛旨在推进国内人工智能技术创.._第三届人工智能大赛网络安全赛道

JDK环境变量配置成功,命令提示符(CMD)中,输入java、javac、java -version等没有反应_cmd中配置java环境后javac无反应-程序员宅基地

文章浏览阅读435次,点赞7次,收藏11次。看起来很不方便,原来若Path变量值是%开头的,它就会显示一个字符串(相当于每一行之间自动添加一个分号);想要显示列表的话,需要将变量值改为以盘符开始。双击环境变量里的path,然后把画圈的那两行移到最上边即可解决问题。但是这样的话,当年再次双击path时就会呈现如下界面,(全是小写)添加到最前面。如图所示即可解决问题。_cmd中配置java环境后javac无反应

CentOS 7 /lib64/libc.so.6: version `GLIBC_2.18' not found_centos 7 /lib64/libc/.so.6:version 'glibc_2.18' no-程序员宅基地

文章浏览阅读1.9k次。# 如果没有安装gcc的话# yum install gccwget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gztar zxf glibc-2.18.tar.gz cd glibc-2.18/mkdir buildcd build/../configure --prefix=/usrmake -j4make install..._centos 7 /lib64/libc/.so.6:version 'glibc_2.18' not found

php怎么在文字外面加方框,文字或字符加外框(方框、边框)的方法-程序员宅基地

文章浏览阅读2.3k次。文字或字符加外框(方框、边框)的方法2012.4.1512:50本文以方框“囗”里打上勾“√”或叉“×”的方法为例,来叙述文字或字符加外框的方法,下面介绍两种方法。方法一:其实质是“√”或“×”(或其它字符)加方框(更简捷确切说法的是文字加框线的应用)在文档中选取已输入好的欲加方框的“√”或“×”,单击“开始”选项卡→点击“段落”组上的“边框和底纹”按钮(与“*框线”等为同一下拉按钮组中)如下图箭..._怎么用php做一个方框里面有文字

推荐文章

热门文章

相关标签