初窥CSRF攻击方式以及Flask-WTF
含義
CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。
解釋
這幅圖非常形象的解釋了CSRF原理的具體過程。
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
- 登錄受信任網(wǎng)站A,并在本地生成Cookie。
- 在不登出A的情況下,訪問危險網(wǎng)站B。
看到這里,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發(fā)生:
-
你不能保證你登錄了一個網(wǎng)站后,不再打開一個tab頁面并訪問另外的網(wǎng)站。
-
你不能保證你關(guān)閉瀏覽器了后,你本地的Cookie立刻過期,你上次的會話已經(jīng)結(jié)束。(事實上,關(guān)閉瀏覽器不能結(jié)束一個會話,但大多數(shù)人都會錯誤的認(rèn)為關(guān)閉瀏覽器就等于退出登錄/結(jié)束會話了…)
-
上圖中所謂的攻擊網(wǎng)站,可能是一個存在其他漏洞的可信任的經(jīng)常被人訪問的網(wǎng)站。
flask 中的CSRF保護
Flask-WTF 表單保護你免受 CSRF 威脅,你不需要有任何擔(dān)心。盡管如此,如果你有不包含表單的視圖,那么它們?nèi)孕枰~外的保護。
例如,由 AJAX 發(fā)送的 POST 請求,并沒有通過表單。在 0.9.0 之前版本,你無法獲得 CSRF 令牌。這就是為什么我們編寫了 CSRF 模塊。
實現(xiàn)
要對所有視圖函數(shù)啟用 CSRF 保護,你需要啟用 CsrfProtect 模塊:
from flask_wtf.csrf import CsrfProtectCsrfProtect(app)
與任何其它的 Flask 擴展一樣,你可以惰性加載它:
from flask_wtf.csrf import CsrfProtectcsrf = CsrfProtect()def create_app():app = Flask(__name__)csrf.init_app(app)
如果模板中有表單,你不需要做任何事。與之前一樣:
<form method="post" action="/">{{ form.csrf_token }}
</form>
但如果模板中沒有表單,你仍需要 CSRF 令牌:
<form method="post" action="/"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>
無論何時未通過 CSRF 驗證,都會返回 400 響應(yīng)。你可以自定義這個錯誤響應(yīng):
@csrf.error_handler
def csrf_error(reason):return render_template('csrf_error.html', reason=reason), 400
我們強烈建議你對所有視圖啟用 CSRF 保護。但也提供了將某些視圖函數(shù)除外的途徑:
@csrf.exempt
@app.route('/foo', methods=('GET', 'POST'))
def my_handler():# ...return 'ok'
參考
https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://docs.jinkan.org/docs/flask-wtf/csrf.html
總結(jié)
以上是生活随笔為你收集整理的初窥CSRF攻击方式以及Flask-WTF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信银行总行信息科技部笔试面试以及最后拿
- 下一篇: 在pycharm中无法引入同一目录下的p