导读:本期聚焦于小伙伴创作的《Flask CSRF保护怎么加?Flask-WTF的CSRFProtect全局防御配置教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Flask CSRF保护怎么加?Flask-WTF的CSRFProtect全局防御配置教程》有用,将其分享出去将是对创作者最好的鼓励。

CSRF即跨站请求伪造,攻击者会诱导已登录的用户点击恶意链接,利用用户的登录状态发起非预期的操作,比如修改账号信息、发起转账等,给Web应用带来严重的安全隐患。Flask本身没有内置CSRF防护机制,借助Flask-WTF扩展的CSRFProtect组件可以很方便地实现全局CSRF防御。

Flask CSRF保护怎么加?Flask-WTF的CSRFProtect全局防御配置教程

环境准备与安装

首先确保已经安装了Flask和Flask-WTF,如果未安装可以通过pip命令安装:

pip install flask flask-wtf

基础配置步骤

1. 设置应用密钥

CSRFProtect需要用到应用密钥来生成和验证CSRF令牌,必须在初始化CSRFProtect之前设置好密钥,密钥需要足够复杂,不要使用简单的字符串。

from flask import Flask

app = Flask(__name__)
# 设置应用密钥,生产环境建议使用环境变量存储
app.config['SECRET_KEY'] = 'your_complex_secret_key_here'

2. 初始化CSRFProtect

导入CSRFProtect类,将Flask应用实例传入完成初始化,初始化后所有POST、PUT、PATCH、DELETE请求都会自动触发CSRF验证。

from flask_wtf.csrf import CSRFProtect

# 初始化CSRF保护组件
csrf = CSRFProtect(app)

3. 表单中添加CSRF令牌

如果使用Flask-WTF的表单类,表单会自动包含CSRF令牌字段,只需要在模板中渲染即可。如果是原生HTML表单,需要手动添加隐藏的CSRF令牌字段。

Flask-WTF表单示例:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class TestForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired()])
    submit = SubmitField('提交')

模板中渲染表单:

<form method="post">
    {{ form.csrf_token }}
    <p>{{ form.username.label }} {{ form.username }}</p>
    <p>{{ form.submit }}</p>
</form>

原生HTML表单添加令牌示例:

<form method="post">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>

常见配置场景

豁免特定接口的CSRF验证

有些接口比如第三方回调接口、开放API不需要CSRF验证,可以通过装饰器豁免:

from flask import request, jsonify

# 豁免该接口的CSRF验证
@csrf.exempt
@app.route('/api/callback', methods=['POST'])
def api_callback():
    data = request.json
    return jsonify({'status': 'success', 'data': data})

自定义CSRF错误响应

默认情况下CSRF验证失败会返回400错误,我们可以自定义错误响应内容:

from flask import jsonify

@csrf.error_handler
def csrf_error(reason):
    return jsonify({'error': 'CSRF验证失败', 'reason': reason}), 400

注意事项

  • 应用密钥必须保密,不要提交到公开的代码仓库中,生产环境建议使用环境变量读取密钥。
  • CSRFProtect默认只对POST、PUT、PATCH、DELETE方法做验证,GET请求不会触发验证,符合安全规范。
  • 如果项目使用了蓝图,初始化CSRFProtect时传入app即可,不需要在蓝图中重复初始化,全局配置会自动生效。
  • 前端如果是通过AJAX发送POST请求,需要在请求头中携带CSRF令牌,令牌可以通过<meta>标签存储后读取。

前端AJAX携带令牌示例:

// 从meta标签获取CSRF令牌
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

fetch('/submit', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': csrfToken
    },
    body: JSON.stringify({username: 'test'})
})

对应的模板中添加meta标签:

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

FlaskCSRF保护Flask_WTFCSRFProtect全局防御配置修改时间:2026-07-22 12:18:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。