flask有关 flask_wtf 中的CSRFProtect 保护
一、介绍
二、代码
三、问题
一、介绍
CSRF跨站请求伪造,源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以抱着一个请求时来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。
为了能够让所有的视图受到CSRF保护,需要扩展 CsrfProtect模块
flask_wtf 里面有该模块
二、代码
1.引入方式
1.1 直接引入
from flask_wtf.csrf import CsrfProtect CsrfProtect(app)
1.2 创建后引入
from flask_wtf.csrf import CsrfProtect csrf = CsrfProtect() def create_app(): app = Flask(__name__) csrf.init_app(app)
2 生成
2.2 token生成方式
from flask_wtf.csrf import generate_csrf # 调用函数生成 csrf_token csrf_token = generate_csrf()
3 使用
3.1 如果使用的是flask模板渲染,可以直接在模板表单里添加
<form method="post" action="/"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> </form>
3.2 如果使用前后端分离,就需要在请求后带入cookie
def create_app(config_name): app = Flask(__name__) #请求钩子 @app.after_request def after_request(response): # 调用函数生成 csrf_token csrf_token = generate_csrf() # 通过 cookie 将值传给前端 response.set_cookie("csrf_token", csrf_token) return response
然后在前端请求时携带上
$.ajax({ url:"/test", type: "post", headers: { "X-CSRFToken": getCookie("csrf_token") }, data: JSON.stringify(params), contentType: "application/json", success: function (res) { console.log(res) } }) // 自定义 getCookie 函数来拿到cookie中的 csrf_token 值 可以使用自己的方式 function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined;}
4. 不验证接口 添加装饰器就好了@csrf.exempt
@csrf.exempt @auth.route('/test', methods=['POST']) def login(): return "不验证token"
三、问题
1. flask_wtf.csrf 当出现csrf 错误验证时的错误捕获,
@app.errorhandler(CSRFError) def handle_csrf_error(e): return e.description, 400