一.CSRF基本介绍:
CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题:个人隐私泄露以及财产安全。
二.防止CSRF攻击的基本步骤:
1.后端生成 csrf_token 的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种: (1)在模板中的 From 表单中添加隐藏字段 (2)将 csrf_token 使用 cookie 的方式传给前端 2.在前端发起请求时,在表单或者在请求头中带上指定的 csrf_token 3.后端在接受到请求之后,取到前端发送过来的 csrf_token,与第1步生成的 csrf_token 的值进行校验 4.如果校验对 csrf_token 一致,则代表是正常的请求,否则可能是伪造请求,不予通过
三.flask中开启CSRF保护实例
校验操作,所以开发者需要做以下 几件事情:
生成 csrf_token 的值
将 csrf_token 的值传给前端浏览器
在前端请求时带上 csrf_token 值
from flask_wtf.csrf import CSRFProtect,generate_csrf
2.开启csrf保护
在creat_app函数中:
# 开启csrf保护 CSRFProtect(app)
将 csrf_token 的值传给前端浏览器(使用请求钩子)
@app.after_request def after_request(response): # 调用生成csrf的函数 csrf_token = generate_csrf() # 通过cookie值传给前端 response.set_cookie("csrf_token",csrf_token) return response
4.在前端请求时带上 csrf_token 值
根据登录和注册的业务逻辑,当前采用的是 ajax 请求
所以在提交登录或者注册请求时,需要在请求头中添加
X-CSRFToken
的键值对
headers: { "X-CSRFToken": getCookie("csrf_token") },