使用flask_wtf 的 csrf時的bug問題

之前接收一個老項目,版本迭代的時候,發現了一個問題,用戶在登出的時候,再次登錄時,報400錯誤,

The CSRF session token is migging.

查了查代碼,才發現問題。
這個flask項目是用flask_wtf的csrf 創建的csrf_token的時候,

#創建一個csrf_token值
    csrf_token=csrf.generate_csrf()

自動會在session中存放一個值,項目的session存放在redis中,則redis中存在該值。
在cookie中,前開發工程師也把csrf_token存放了一份在cookie中,

# 設置cookie值
    resp.set_cookie("csrf_token", csrf_token)

在項目中使用flask_wtf的CSRFProtect(app)進行保護的時候,實則是從session中讀取csrf_token值,與前端請求數據中的headers中傳過來的csrf_token進行比較。
當登出清除session時,csrf_token值也一起刪除了,而瀏覽器再次加載頁面時,由於瀏覽器緩存機制,是通過瀏覽器的緩存訪問頁面,並未經過後臺,所以不會再生成csrf_token,也不會存放在redis的session中,導致csrf機制報錯.
當然,清空緩存,刷新後,則可以再次登錄,但這不是個解決辦法。
在不破壞原有代碼體系上,即 依舊使用flask_wtf的csrf機制,
可以在清空session前,獲取csrf_token的值,清空後再加上。

csrf_token=session.get('csrf_token')
session.clear()
session['csrf_token']=csrf_token
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章