Flask 之 CSRF 攻击
安装
pip install flask_wtf
使用
在 Flask 中, Flask-wtf 扩展有一套完善的 csrf 防护体系,对于我们开发者来说,使用起来非常简单
- 设置应用程序的 secret_key,用于加密生成的 csrf_token 的值
# 1. session加密的时候已经配置过了.如果没有在配置项中设置,则如下: app.secret_key = "#此处可以写随机字符串#" # 2. 也可以写在配置类中。 class Config(object): DEBUG = True SECRET_KEY = "dsad32DASSLD*13%^32" """加载配置""" app.config.from_object(Config)
- 导入 flask_wtf.csrf 中的 CSRFProtect 类,进行初始化,并在初始化的时候关联 app
from flask.ext.wtf import CSRFProtect CSRFProtect(app)
- 在表单中使用 CSRF 令牌:
<form method="post" action="/"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> </form>
示例
run.py
视图代码;
from flask import Flask,render_template from settings.dev import Config from flask_script import Manager from flask_wtf.csrf import CSRFProtect # from flask.ext.wtf import CSRFProtect # 低版本的flask直接可以引入 """创建flask应用""" app = Flask(__name__,template_folder='templates') """使用脚手架[终端脚本]启动项目""" manage = Manager(app) """加载配置""" app.config.from_object(Config) """初始化csrf防范机制""" CSRFProtect(app) @app.route("/login",methods=["get"]) def loginform(): return render_template("login.html") @app.route("/dologin",methods=["post"]) def login(): return "ok" if __name__ == '__main__': manage.run()
login.html
模板代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{{ url_for('login') }}" method="post"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> <input type="submit" value="登录"> </form> </body> </html>
dev.py
# 声明一个配置类 class Config(object): SECRET_KEY = "DD434O7HQ2131!@#edn#hu!@!g@uWO1NS"
没有使用CSRF 令牌:
使用CSRF 令牌:
csrf怎么识别提交过来的csrf_token是正确的?
原理和jwt认证是一样的。
csrf_token也是token令牌的应用方式,也是分 "头部.载荷.签证"
在表单提交到服务端时,WTForms内部会直接截取提交的csrf_token的头部和载荷,并从flask中提取秘钥SECRET_KEY,生成一个新的签证,新签证与客户端提交的csrf_token签证进行字符串比较,相同则表示token没有问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?