例如,由 ajax 傳送的 post 請求,然而它背後並沒有表單。在 flask-wtf 0.9.0 以前的版本你無法獲得 csrf 令牌。這是為什麼我們要實現 csrf。
①使用者正常登入a銀行**,
②a**返回cookie資訊給使用者,瀏覽器儲存cookie資訊
③在a**沒有退出登入的情況下(或者說cookie資訊沒過期), 登入了惡意**b
⑤在使用者主觀未知的情況下,訪問a**,此時瀏覽器會自動攜帶cookie資訊
⑥a**識別到cookie資訊,預設為是使用者本人做出的請求,根據請求做出相應的操作.
⑦使用者收到損失.
根據 csrf_token 校驗原理,具體操作步驟有以下幾步:
1.後端生成 csrf_token 的值,在前端請求登入或者註冊介面的時候將值傳給前端,傳給前端的方式可能有以下兩種:
在模板中的 from 表單中新增隱藏字段
將 csrf_token 使用 cookie 的方式傳給前端
2.在前端發起請求時,在表單或者在請求頭中帶上指定的 csrf_token
3.後端在接受到請求之後,取到前端傳送過來的 csrf_token,與第1步生成的 csrf_token 的值進行校驗
4.如果校驗對 csrf_token 一致,則代表是正常的請求,否則可能是偽造請求,不予通過
然後實現
為了能夠讓所有的檢視函式受到 csrf 保護,需要開啟 csrfprotect 模組:
from flask_wtf.csrf import csrfprotect但是如果模板中沒有表單,就需要乙個 csrf 令牌: 無論何時未通過 csrf 驗證,都會返回 400 響應。可以自定義這個錯誤響應:像任何其它的 flask 擴充套件一樣,你可以惰性載入它:
from flask_wtf.csrf import csrfprotect
csrf = csrfprotect()
note
需要為 csrf 保護設定乙個秘鑰。通常下,同 flask 應用的 secret_key 是一樣的。
如果模板中存在表單,不需要做任何事情。與之前一樣:
@csrf.error_handler建議對所有檢視啟用 csrf 保護。也提供了某些檢視函式不需要保護的裝飾器:def csrf_error(reason):
return render_template('csrf_error.html', reason=reason), 400
@csrf.exempt預設情況下也可以在所有的檢視中禁用 csrf 保護,通過設定 wtf_csrf_check_default 為 false,僅僅當需要的時候選擇呼叫 csrf.protect()。這也能夠在檢查 csrf 令牌前做一些預先處理:def my_handler():
# ...
return 'ok'
def check_csrf():
if not is_oauth(request):
csrf.protect()
在 meta 標籤中渲染 csrf 令牌:
在 script 標籤中渲染同樣可行: 下面的例子採用了在 meta標籤渲染的方式, 在 script 中渲染會更簡單,無須擔心沒有相應的例子。無論何時,傳送 ajax post 請求,為其新增 x-csrftoken 頭:
var csrftoken = $(『meta[name=csrf-token]').attr(『content')或者這麼寫ajax:katex parse error: expected '}', got 'eof' at end of input: …|options|trace)/i.test(settings.type) && !this.crossdomain)
}})
在提交請求時,需要在請求頭中新增 x-csrftoken 的鍵值對:
$.ajax(,...})
CSRF的理解及Flask和Django的解決方案
攻擊的原理 1.使用者正常登入 a 2.a 向使用者瀏覽器寫入cookies 包含登入資訊 3.使用者在沒有登出的情況下,訪問了 b 攻擊 4.b 偽造了乙個 a 的請求,誘導使用者去點選 如何解決?在表單和cookie中,同時寫入相同的token值,使用者在提交表單時,驗證cookie和表單中 或...
CSRF攻擊原理及防禦
於 一 csrf攻擊原理 csrf是什麼呢?csrf全名是cross site request forgery,是一種對 的惡意利用,csrf比xss更具危險性。想要深入理解csrf的攻擊特性我們有必要了解一下 session的工作原理。session我想大家都不陌生,無論你用.net或php開發過...
CSRF 攻擊原理及防護
csrf 的英文全稱是 cross site request forgery 縮寫也稱 xscf,也被稱之為 one click attack 或者 session riding csrf 和 xss 非常的像,但是它們是有很大的區別的,並且攻擊方式也不一樣 xss 是利用站點內的信任使用者,而 c...