Flask_CSRF保护(十一)
flask使用 flask-wtf 模块提供的 CSRFProtect对象开启CSRF防护,方法如下:
后端设置
from flask import Flask from flask_wtf.csrf import CSRFProtect app = Flask(__name__) # 使用防csrf保护APP csrf = CSRFProtect(app)
前端设置
使用Jinja2模板
在头部或底部增加下列代码:
<!-- 如果开启csrf保护,需要在html页面中的head中定义如下代码 --> <meta name="csrf-token" content="{{ csrf_token() }}">
在js中增加下列代码
var csrftoken = $('meta[name=csrf-token]').attr('content')
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
不使用模板
// js读取cookie的方法 function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; }; $.ajax({ url: "/api", type: "post", data: req_json, contentType: "application/json", dataType: "json", // 如果不使用模板,又开启了CSRF保护,需要在POST接口的headers中添加 X-CSRFToken字段,字段值为cookie中的csrf_token值 headers: { "X-CSRFToken": getCookie("csrf_token") // 使用自定义的getCookie方法提取csrf_token值 }, success: function (resp) { console.log("success") } })
取消保护
开启CSRF后,如果指定接口要取消保护,可以使用如下装饰器
@csrf.exempt # 取消csrf保护 @app.route("/del", methods=["POST"]) def delete(): pass