当前位置:首页 > 工具 > 正文内容

基于 Flask-WTF 的 CSRF 防护机制与实现

访客 工具 2026年7月17日 1

跨站请求伪造(CSRF)是一种常见的 Web 安全威胁,攻击者通过诱导已认证用户访问恶意链接,利用其有效会话执行非预期操作。Flask-WTF 扩展为 Flask 应用提供了内建的 CSRF 防御能力,无需手动实现令牌生成与校验逻辑。

安装依赖

pip install flask-wtf

核心防护原理

CSRF 防护的核心在于验证请求来源的合法性。服务端为每个用户会话生成唯一且不可预测的令牌,前端提交表单时需携带该令牌,服务端校验通过后方可执行后续逻辑。

CSRF防护流程示意图

服务端集成步骤

配置密钥

密钥用于加密 CSRF 令牌,可通过直接赋值或配置类方式设置。

# 直接设置
app.secret_key = "your-random-string-here"

# 或通过配置类
class AppConfig(object):
    DEBUG = True
    SECRET_KEY = "dsad32DASSLD*13%^32"

app.config.from_object(AppConfig)

初始化 CSRF 保护

提供两种初始化模式:延迟绑定与立即绑定。

# 模式一:延迟绑定(推荐,避免循环引用)
from flask_wtf import CSRFProtect

csrf_guard = CSRFProtect()

def create_app():
    app = Flask(__name__)
    # ... 加载配置
    csrf_guard.init_app(app)
    return app

# 模式二:立即绑定
# CSRFProtect(app)

完整应用示例

from flask import Flask, render_template, request, session, redirect, url_for
from flask_wtf import CSRFProtect
from flask_wtf.csrf import generate_csrf

app = Flask(__name__, template_folder="templates", static_folder="static")

# 应用配置
app.config.update({
    "DEBUG": True,
    "SECRET_KEY": ":123.,2,s,"
})

# 启用 CSRF 防护
CSRFProtect(app)


@app.route("/")
def home():
    page_title = "网站首页"
    return render_template("index.html", **locals())


@app.route("/login", methods=["GET", "POST"])
def authenticate():
    page_title = "用户登录"
    
    if request.method == "GET":
        csrf_value = generate_csrf()
        return render_template("login.html", **locals())
    
    # POST 请求自动经过 CSRF 校验
    account = request.form.get("username")
    secret = request.form.get("password")
    
    if account == "xiaoming" and secret == "123456":
        session["current_user"] = "xiaoming"
        session["auth_status"] = True
        return "登录成功!<br><a href='/'>返回首页</a>"
    
    return "登录失败!<br>><a href='/login'>重新登录</a>"


if __name__ == '__main__':
    app.run()

前端模板配置

表单嵌入 CSRF 令牌

在 HTML 表单中通过隐藏字段传递令牌,模板引擎渲染时自动填充有效值。

<!-- login.html -->
<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ page_title }}</title>
</head>
<body>
    <form action="/login" method="post">
        <input type="hidden" name="csrf_token" value="{{ csrf_value }}">
        
        <label>登录账号:</label>
        <input type="text" name="username" required>
        <br><br>
        
        <label>登录密码:</label>
        <input type="password" name="password" required>
        <br><br>
        
        <button type="submit">登录</button>
    </form>
</body>
</html>

首页模板

<!-- index.html -->
<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ page_title }}</title>
</head>
<body>
    {% if session.get("auth_status") %}
        <a href="/user">欢迎回来,{{ session["current_user"] }}</a>
    {% else %}
        <a href="{{ url_for('authenticate') }}">登录</a>
    {% endif %}
</body>
</html>

关键注意事项

  • 所有状态变更操作(POST/PUT/DELETE)务必启用 CSRF 验证
  • 密钥需保持足够复杂度且妥善保管,避免硬编码于版本控制
  • AJAX 请求需在请求头中携带 X-CSRFToken 字段
  • 生产环境建议配合 HTTPS 使用,防止令牌传输过程中被截获

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。