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

 

posted @ 2024-01-09 15:24  PKGAME  阅读(118)  评论(0编辑  收藏  举报