Flask WTF中的csrf保護

2022-06-18 21:12:10 字數 2077 閱讀 1344

這部分文件介紹了 csrf 保護。

例如,由 ajax 傳送的 post 請求,然而它背後並沒有表單。在 flask-wtf 0.9.0 以前的版本你無法獲得 csrf 令牌。這是為什麼我們要實現 csrf。

為了能夠讓所有的檢視函式受到 csrf 保護,你需要開啟csrfprotect模組:

from flask_wtf.csrf import

csrfprotect

像任何其它的 flask 擴充套件一樣,你可以惰性載入它:

from flask_wtf.csrf import

csrfprotect

csrf =csrfprotect()

def)

note

你需要為 csrf 保護設定乙個秘鑰。通常下,同 flask 應用的 secret_key 是一樣的。

如果模板中存在表單,你不需要做任何事情。與之前一樣:

但是如果模板中沒有表單,你仍然需要乙個 csrf 令牌:

無論何時未通過 csrf 驗證,都會返回 400 響應。你可以自定義這個錯誤響應:

@csrf.error_handler

defcsrf_error(reason):

return render_template('

csrf_error.html

', reason=reason), 400

我們強烈建議你對所有檢視啟用 csrf 保護。但也提供了某些檢視函式不需要保護的裝飾器:

@csrf.exempt

'/foo

', methods=('

get', '

post'))

defmy_handler():

#...

return'ok

'

預設情況下你也可以在所有的檢視中禁用 csrf 保護,通過設定wtf_csrf_check_defaultfalse,僅僅當你需要的時候選擇呼叫csrf.protect()。這也能夠讓你在檢查 csrf 令牌前做一些預先處理:

defcheck_csrf():

ifnot

is_oauth(request):

csrf.protect()

不需要表單,通過 ajax 傳送 post 請求成為可能。0.9.0 版本後這個功能變成可用的。

獲取 csrf 令牌。這個方法在每個模板中都可以使用,你並不需要擔心在沒有表單時如何渲染 csrf 令牌字段。

我們推薦的方式是在標籤中渲染 csrf 令牌:

"

csrf-token

" content="

}">

下面的例子採用了在標籤渲染的方式, 在中渲染會更簡單,你無須擔心沒有相應的例子。

無論何時你傳送 ajax post 請求,為其新增x-csrftoken頭:

var csrftoken = $('meta[name=csrf-token]').attr('content')

$.ajaxsetup(}})

當你定義你的表單的時候,如果犯了 `這個錯誤`_

: 從wtforms中匯入form而不是從flask.ext.wtf中匯入,csrf 保護的大部分功能都能工作(除了form.validate_on_submit()),但是 csrf 保護將會發生異常。在提交表單的時候,你將會得到bad request

/csrf token missing or incorrect

錯誤。這個錯誤的出現就是因為你的匯入錯誤,而不是你的配置問題。

使用flask wtf 的 csrf時的bug問題

之前接收乙個老專案,版本迭代的時候,發現了乙個問題,使用者在登出的時候,再次登入時,報400錯誤,the csrf session token is migging.查了查 才發現問題。這個flask專案是用flask wtf的csrf 建立的csrf token的時候,建立乙個csrf token...

初窺CSRF攻擊方式以及Flask WTF

csrf cross site request forgery 中文名稱 跨站請求偽造,也被稱為 one click attack session riding,縮寫為 csrf xsrf。從上圖可以看出,要完成一次csrf攻擊,受害者必須依次完成兩個步驟 登入受信任 a,並在本地生成cookie。...

spring security中csrf的處理

spring boot 與spring security進行整合的時候需要考慮csrf的問題。但是,有時候csrf會攔截所有的post請求,此時應該怎麼辦,首先,我們在header.html中新增一下 此處的header.html可以理解為每個頁面的頭部,為了整合方便,將頁面頭部單獨提取出來為hea...