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

 

posted @ 2020-12-14 15:55  码上测  阅读(365)  评论(0编辑  收藏  举报