1. 程式人生 > >django跨站保護機制和CSRF

django跨站保護機制和CSRF

CSRF:Cross-site request forgery,叫做跨站請求偽造,是指偽裝來自受信任使用者的請求來利用受信任的網站完成攻擊。

下面是我在網上看到的一個比較好的通俗的解釋:

   受害者 Bob 在銀行有一筆存款,通過對銀行的網站傳送請求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款轉到 bob2 的賬號下。通常情況下,該請求傳送到網站後,伺服器會先驗證該請求是否來自一個合法的 session,並且該 session 的使用者 Bob 已經成功登陸。

        黑客 Mallory 自己在該銀行也有賬戶,他知道上文中的 URL 可以把錢進行轉帳操作。Mallory 可以自己傳送一個請求給銀行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是這個請求來自 Mallory 而非 Bob,他不能通過安全認證,因此該請求不會起作用。

        這時,Mallory 想到使用 CSRF 的攻擊方式,他先自己做一個網站,在網站中放入如下程式碼: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,並且通過廣告等誘使 Bob 來訪問他的網站。當 Bob 訪問該網站時,上述 url 就會從 Bob 的瀏覽器發向銀行,而這個請求會附帶 Bob 瀏覽器中的 cookie 一起發向銀行伺服器。大多數情況下,該請求會失敗,因為他要求 Bob 的認證資訊。但是,如果 Bob 當時恰巧剛訪問他的銀行後不久,他的瀏覽器與銀行網站之間的 session 尚未過期,瀏覽器的 cookie 之中含有 Bob 的認證資訊。這時,悲劇發生了,這個 url 請求就會得到響應,錢將從 Bob 的賬號轉移到 Mallory 的賬號,而 Bob 當時毫不知情。等以後 Bob 發現賬戶錢少了,即使他去銀行查詢日誌,他也只能發現確實有一個來自於他本人的合法請求轉移了資金,沒有任何被攻擊的痕跡。而 Mallory 則可以拿到錢後逍遙法外。

作為django,內建了跨站保護機制,但是這個機制在我們使用的時候經常會出現問題,例如直接寫一個form表單,提交資料就會導致機制生效而被誤認為是一個跨站請求,這時候需要的方法來達到保護要求避免這個機制生效

下面是三種方式:

1、在form表單中加入{% csrf_token %},達到保護要求避免這個機制生效,csrf_token的作用就是通過渲染,將token替換為一個input,value等於隨機數token的標籤,然後提交,提交的時候會提交隨機數token,然後在伺服器端進行token驗證。

如:

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div align="center"><input type="file" name="use_head_photo" class="btn btn-default" ></div>
    <input type="submit"class="btn btn-default" value="提交" name="submit_user_photo">
</form>

2、為檢視函式新增@csrf_exempt 修飾,取消csrf_token驗證,失效機制

3、setting.py中在MIDDLEWAY中禁用csrf一項(django.middleware.csrf.CsrfViewMiddleware)來禁用中介軟體,注意這個方法是全域性禁用