這篇文章給大家介紹如何在Django中使用csrf 驗(yàn)證,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
天元ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!Django 提供的 CSRF 防護(hù)機(jī)制
django 第一次響應(yīng)來(lái)自某個(gè)客戶端的請(qǐng)求時(shí),會(huì)在服務(wù)器端隨機(jī)生成一個(gè) token,把這個(gè) token 放在 cookie 里。然后每次 POST 請(qǐng)求都會(huì)帶上這個(gè) token,
這樣就能避免被 CSRF 攻擊。
1.在返回的 HTTP 響應(yīng)的 cookie 里,django 會(huì)為你添加一個(gè) csrftoken 字段,其值為一個(gè)自動(dòng)生成的 token
2.在所有的 POST 表單時(shí),必須包含一個(gè) csrfmiddlewaretoken 字段 (只需要在模板里加一個(gè) tag, django 就會(huì)自動(dòng)幫你生成,見下面)
3.在處理 POST 請(qǐng)求之前,django 會(huì)驗(yàn)證這個(gè)請(qǐng)求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個(gè)合法的請(qǐng)求,否則,這個(gè)請(qǐng)求可能是來(lái)自于別人的 csrf 攻擊,返回 403 Forbidden.
4.在所有 ajax POST 請(qǐng)求里,添加一個(gè) X-CSRFTOKEN header,其值為 cookie 里的 csrftoken 的值
Django 里如何使用 CSRF 防護(hù)
首先,最基本的原則是:GET 請(qǐng)求不要用有副作用。也就是說(shuō)任何處理 GET 請(qǐng)求的代碼對(duì)資源的訪問都一定要是“只讀“的。
要啟用 django.middleware.csrf.CsrfViewMiddleware 這個(gè)中間件
再次,在所有的 POST 表單元素時(shí),需要加上一個(gè) {% csrf_token %} tag
在渲染模塊時(shí),使用 RequestContext。RequestContext 會(huì)處理 csrf_token 這個(gè) tag, 從而自動(dòng)為表單添加一個(gè)名為 csrfmiddlewaretoken 的 input
在Django 中對(duì)csrf 的防范
Django中自帶了防止csrf攻擊的功能,但對(duì)于初學(xué)者來(lái)說(shuō)可能不知道如何使用,并給自己帶來(lái)些意外的麻煩。
例如:一個(gè)正常的表單提交操作卻總是報(bào)錯(cuò)。
Django 中GET請(qǐng)求不需要csrf認(rèn)證,post請(qǐng)求需要正確的認(rèn)證才能得到正確的返回結(jié)果。
我們先處理一下對(duì)表單提交的 csrf 驗(yàn)證問題:一般在POST表單中加入{% csrf_token %}
<form method="POST" action="#"> {% csrf_token %} <input name='password' value='用戶密碼'> </form>
加入了這句話后,再次提交post表單就不會(huì)出現(xiàn)問題了。
或者是另一個(gè)思路:禁用csrf
不過這樣可能帶來(lái)的危害你自己要想清楚了。
全局禁用:settings文件中找到關(guān)于csrf的中間件,直接注釋。
針對(duì)性禁用:在表單提交的對(duì)應(yīng)視圖函數(shù)上加上一個(gè)裝飾器 @csrf_exempt
——————————————————————
{% csrf_token %} 實(shí)際上是一個(gè)模板語(yǔ)法,將項(xiàng)目的token值寫入到前端頁(yè)面的表單中,這個(gè)值在建立django項(xiàng)目時(shí)就已經(jīng)自動(dòng)生成,可以在setting中看到。
——————————————————————–
下面再看一下Ajax調(diào)用時(shí)的處理方式
在使用 jquery 的 ajax 或者 post 之前可以加入一段 js 代碼
jQuery(document).ajaxSend(function(event, xhr, settings) { function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } function sameOrigin(url) { // url could be relative or scheme relative or absolute var host = document.location.host; // host + port var protocol = document.location.protocol; var sr_origin = '//' + host; var origin = protocol + sr_origin; // Allow absolute or scheme relative URLs to same origin return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || // or any other URL that isn't scheme relative or absolute i.e relative. !(/^(\/\/|http:|https:).*/.test(url)); } function safeMethod(method) { return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } if (!safeMethod(settings.type) && sameOrigin(settings.url)) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } });
或者是直接在模板文件中寫入
$.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, });
關(guān)于如何在Django中使用csrf 驗(yàn)證就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:如何在Django中使用csrf驗(yàn)證-創(chuàng)新互聯(lián)
新聞來(lái)源:http://jinyejixie.com/article2/ccpeic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、標(biāo)簽優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容