国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django進階之CSRF的解決

2020-01-04 14:51:29
字體:
來源:轉載
供稿:網友

簡介

django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設置防跨站請求偽造功能有分為全局和局部。

全局

中間件 django.middleware.csrf.CsrfViewMiddleware

局部:

@csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。

@csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。

注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect

原理

當用post提交數據的時候,django會去檢查是否有一個csrf的隨機字符串,如果沒有就會報錯,這也是之前我們一直將其注釋的原因,錯誤如下:

Django,CSRF

在django內部支持生成這個隨機字符串

通過form提交

在form表單里面需要添加{%csrf_token%}

這樣當你查看頁面源碼的時候,可以看到form中有一個input是隱藏的

Django,CSRF

總結原理:當用戶訪問login頁面的時候,會生成一個csrf的隨機字符串,,并且cookie中也存放了這個隨機字符串,當用戶再次提交數據的時候會帶著這個隨機字符串提交,如果沒有這個隨機字符串則無法提交成功

cookie中存放的csrftoken如下圖

Django,CSRF

通過ajax提交

因為cookie中同樣存在csrftoken,所以可以在js中通過:

$.cooke("cstftoken")獲取

如果通過ajax進行提交數據,這里提交的csrftoken是通過請求頭中存放,需要提交一個字典類型的數據,即這個時候需要一個key。

在views中的login函數中:from django.conf import settings,然后打印print(settings.CSRF_HEADER_NAME)

這里需要注意一個問題,這里導入的settings并不是我們在項目文件下看到的settings.py文件,這里是是一個全局的settings配置,而當我們在項目目錄下的settings.py中配置的時候,我們添加的配置則會覆蓋全局settings中的配置

print(settings.CSRF_HEADER_NAME)打印的內容為:HTTP_X_CSRFTOKEN

這里的HTTP_X_CSRFTOKEN是django在X_CSRF的前面添加了HTTP_,所以實際傳遞的是就是X_CSRFtoken,而在前端頁面的ajax傳遞的時候由于不能使用下劃線所以傳遞的是X_CSRFtoken

下面是在前端ajax中寫的具體內容:

$("#btn1").click(function () {    $.ajax({      url:"/login/",      type:"POST",      data:{"usr":"root","pwd":"123"},      headers:{ "X-CSRFtoken":$.cookie("csrftoken")},      success:function (arg) {      }    })  })

但是如果頁面中有多個ajax請求的話就在每個ajax中添加headers信息,所以可以通過下面方式在所有的ajax中都添加

  $.ajaxSetup({      beforeSend:function (xhr,settings) {        xhr.setRequestHeader("X-CSRFtoken",$.cookie("csrftoken"))      }    });

這樣就會在提交ajax之前執行這個方法,從而在所有的ajax里都加上這個csrftoken

這里的xhr是XMLHttpRequest的簡寫,ajax調用的就是這個方法

如果想要實現在當get方式的時候不需要提交csrftoken,當post的時候需要,實現這種效果的代碼如下:

function csrfSafeMethod(method) {      // these HTTP methods do not require CSRF protection      return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));    }    $.ajaxSetup({      beforeSend: function(xhr, settings) {        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {          xhr.setRequestHeader("X-CSRFToken", csrftoken);        }      }    });

這樣就實現了當GET|HEAD|OPTIONS|TRACE這些方式請求的時候不需要提交csrftoken

總結

1、 csrf在ajax提交的時候通過請求頭傳遞的給后臺的

2、 csrf在前端的key為:X-CSRFtoken,到后端的時候django會自動添加HTTP_,并且最后為HTTP_X_CSRFtoken

3、 csrf在form中提交的時需要在前端form中添加{%csrftoken%}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 襄汾县| 榆社县| 拜城县| 五峰| 荣昌县| 敦化市| 临泽县| 马边| 岗巴县| 宁乡县| 五家渠市| 宁南县| 台前县| 巴里| 两当县| 滦平县| 鹰潭市| 瑞安市| 南城县| 桦甸市| 原平市| 襄垣县| 华亭县| 凌源市| 伽师县| 盐城市| 汕头市| 呼伦贝尔市| 政和县| 梅州市| 夏河县| 秦安县| 兴隆县| 静海县| 宁波市| 同德县| 穆棱市| 汝州市| 墨玉县| 兴义市| 太和县|