python Djanjo csrf說明與配置

 Django csrf django

CSRF 全稱(Cross Site Request Forgery)跨站請求僞造。也被稱爲One Click Attack和Session Riding,一般縮寫爲CSRF或XSRF。你能夠這樣理解:攻擊者(黑客,釣魚網站)盜用了你的身份,以你的 名義發送惡意請求,這些請求包括髮送郵件、發送信息、盜用帳號、購買商品、銀行轉帳,從而使你的我的隱私泄露和財產損失。

瀏覽器

CSRF原理

一、用戶登陸並信任網站A
二、驗證經過,在用戶處產生A的Cookie
三、用戶在沒有登出網站A的狀況下,訪問危險網站B
四、網站B要求訪問第三站點網站A,發出一個request
五、根據網站B的請求,瀏覽器帶着網站A產生的Cookie訪問網站A
六、網站A不知道請求是用戶發出的仍是網站B發出的,因爲瀏覽器會自動帶上用戶Cookie,因此網站A會根據用戶的權限處理請求,這樣網站B就達到了模擬用戶操做的目的安全

從上面步驟中能夠看出,要完成一次CSRF攻擊,受害者必須依次完成如下兩個步驟:服務器

登陸受信任網站A,並在本地生成Cookie
在不登出A的狀況下,訪問危險網站B
看到這裏,你也許會問:若是我不知足以上兩個條件中的一個,我就不會受到CSRF攻擊。是的,確實如此,可是你不能保證如下狀況不會發生cookie

你不能保證你登陸了一個網站以後,再也不打開一個tab頁面並訪問其餘的網站
你不能保證你關閉瀏覽器以後,你本地的Cookie會馬上過時,你上次的會話已經結束
上述中所謂的攻擊網站,可能就是一個釣魚網站

session

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帳戶裏,而我絲絕不知情。

spa

進入settings.py找到  MIDDLEWARE  這個列表找到    'django.middleware.csrf.CsrfViewMiddleware',  這個字段orm

這一行設置csrf的若是把它註釋掉csrf將失效csrf

 

如今我在django寫了一個HTML表單當我點擊提交的時候會變爲提交方式會變爲POST而後就會發現報了一個  403 的csrf錯誤

這是由於django的防禦功能    因沒有提供Referer值而被誤認爲CSRF攻擊,拒絕訪問 怎麼解決這個問題呢?

 

 

能夠在form表單下面加上    {%csrf_token%}     當你檢查的時候就會發現多了一個input數據 這是  {%csrf_token%}  自動轉化的數據提供瀏覽器進行確認

若是成功就能夠正常訪問錯誤則拒絕訪問

而後你就會發現跳轉頁面的時候訪問成功了

 

相關文章
相關標籤/搜索