Django csrf CSRF 全稱(Cross Site Request Forgery)跨站請求偽造。也被稱為One Click Attack和Session Riding,通常縮寫為CSRF或XSRF。你可以這樣理解:攻擊者(黑客,釣魚網站)盜用了你的身份,以你的 名義發送惡意請求,這些請求 ...
Django csrf
CSRF 全稱(Cross Site Request Forgery)跨站請求偽造。也被稱為One Click Attack和Session Riding,通常縮寫為CSRF或XSRF。你可以這樣理解:攻擊者(黑客,釣魚網站)盜用了你的身份,以你的 名義發送惡意請求,這些請求包括發送郵件、發送信息、盜用賬號、購買商品、銀行轉賬,從而使你的個人隱私泄露和財產損失。
CSRF原理
1、用戶登錄並信任網站A
2、驗證通過,在用戶處產生A的Cookie
3、用戶在沒有登出網站A的情況下,訪問危險網站B
4、網站B要求訪問第三站點網站A,發出一個request
5、根據網站B的請求,瀏覽器帶著網站A產生的Cookie訪問網站A
6、網站A不知道請求是用戶發出的還是網站B發出的,由於瀏覽器會自動帶上用戶Cookie,所以網站A會根據用戶的許可權處理請求,這樣網站B就達到了模擬用戶操作的目的
從上面步驟中可以看出,要完成一次CSRF攻擊,受害者必須依次完成以下兩個步驟:
登錄受信任網站A,併在本地生成Cookie
在不登出A的情況下,訪問危險網站B
看到這裡,你也許會問:如果我不滿足以上兩個條件中的一個,我就不會受到CSRF攻擊。是的,確實如此,但是你不能保證以下情況不會發生
你不能保證你登錄了一個網站之後,不再打開一個tab頁面並訪問其他的網站
你不能保證你關閉瀏覽器之後,你本地的Cookie會立刻過期,你上次的會話已經結束
上述中所謂的攻擊網站,可能就是一個釣魚網站
CSRF攻擊實例
聽了這麼多,可能大家還雲里霧裡,光聽概念可能大家對於CSRF還是不夠瞭解,下麵我將舉一個例子來讓大家對CSRF有一個更深層次的理解。
我們先假設支付寶存在CSRF漏洞,我的支付寶賬號是wl,攻擊者的支付寶賬戶是xxx,然後我們通過網頁請求的方式 http://zhifubao.com/withdraw?account=lyq&amount=10000&for=wl 可以把賬號的wl的10000元轉到我的另外一個 賬戶wl上面去。通常這個情況下,該請求發送到支付寶伺服器後,伺服器會先驗證請求是否來自一個合法的session,並且該session的用戶已經成功登錄。攻擊者在支付寶也有賬戶xxx,他直到上文中的URL可以進行轉賬操作,於是他自己可以發送一個請求 http://zhifubao.com/withdraw?account=lyq&amount=10000&for=xxx 到支付寶後臺。但是這個請求是來自攻擊者而不是我wl,所以不能通過安全認證,因此該請求作廢。這時,攻擊者xxx想到了用CSRF的方式,他自己做了個網站,在網站中放瞭如下代碼:http://zhifubao.com/withdraw?account=lyq&amount=10000&for=xxx ,並且通過網站鏈接誘使我來訪問他的網站。當我禁不住誘惑時就會點了進去,上述請求就會從我自己的瀏覽器發送到支付寶,而且這個請求會附帶我的瀏覽器中的cookie。大多數情況下,該請求會失敗,因為支付寶要求我的認證信息,但是我如果剛訪問支付寶不久,還沒有關閉支付寶頁面,我的瀏覽器中的cookie存有我的認證信息,這個請求就會得到響應,從我的賬戶中轉10000元到xxx賬戶里,而我絲毫不知情。
進入settings.py找到 MIDDLEWARE 這個列表找到 'django.middleware.csrf.CsrfViewMiddleware', 這個欄位
這一行設置csrf的如果把它註釋掉csrf將失效
現在我在django寫了一個HTML表單當我點擊提交的時候會變為提交方式會變為POST然後就會發現報了一個 403 的csrf錯誤
這是因為django的防護功能 因沒有提供Referer值而被誤認為CSRF攻擊,拒絕訪問 怎麼解決這個問題呢?
可以在form表單下麵加上 {%csrf_token%} 當你檢查的時候就會發現多了一個input數據 這是 {%csrf_token%} 自動轉化的數據提供瀏覽器進行確認
如果成功就可以正常訪問錯誤則拒絕訪問
然後你就會發現跳轉頁面的時候訪問成功了