DjangoCSRF簡(jiǎn)述-創(chuàng)新互聯(lián)

CSRF(Cross-site request forgery),中文名稱(chēng)是跨站請(qǐng)求偽造。什么意思呢?簡(jiǎn)單的說(shuō),就是用戶(hù)在網(wǎng)站A登錄之后,網(wǎng)站生成了對(duì)應(yīng)的Cookie等信息,然后這個(gè)時(shí)候,用戶(hù)又打開(kāi)了網(wǎng)站B,網(wǎng)站B可以在提交表單的時(shí)候,指定對(duì)象的地址為網(wǎng)站A,這樣就對(duì)網(wǎng)站A提出了一個(gè)請(qǐng)求。

10年的定安網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整定安建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“定安網(wǎng)站設(shè)計(jì)”,“定安網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

為了避免這種惡意請(qǐng)求,一般的方法是在客戶(hù)端生成一個(gè)Token,每次提交來(lái)的請(qǐng)求,服務(wù)器都會(huì)驗(yàn)證這個(gè)Token之后才會(huì)放行。Django里面,默認(rèn)配置文件里面有一個(gè)中間件,可以幫我們實(shí)現(xiàn)這個(gè)功能。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

在前面的例子里面,我們都是注釋掉了csrf這個(gè)中間件。因?yàn)橐坏┦褂玫脑?huà),會(huì)自動(dòng)在Cookie里面生成一個(gè)CSRFToken。相對(duì)應(yīng)的,在模板文件里面我們也必須提供對(duì)應(yīng)的csrftoken,否則提交post請(qǐng)求的時(shí)候,就會(huì)出現(xiàn)下面的錯(cuò)誤。

Django CSRF 簡(jiǎn)述

在打開(kāi)著CSRF的中間件之后,如果觀(guān)察Cookie,會(huì)發(fā)現(xiàn)他自動(dòng)生成了一個(gè)csrftoken的鍵值對(duì)。

Django CSRF 簡(jiǎn)述

如何使用呢?最簡(jiǎn)單的方式就是在模板文件的form里面添加一行 {% csrf_token %},這樣就行了

<form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="text" name="pwd" />
        <input type="checkbox" name="rmb" value="1" /> 10秒免登錄
        <input type="submit" value="提交" />
        <input id="btn1" type="button" value="按鈕" />
        <input id="btn2" type="button" value="按鈕" />
    </form>

除了POST提交數(shù)據(jù),我們還可以通過(guò)AJAX來(lái)提交數(shù)據(jù)。那么在AJAX里面應(yīng)該如何使用呢?有兩種方式:

  1. 可以在具體的一個(gè)AJAX請(qǐng)求里面添加一個(gè)header,header里面的csrftoken通過(guò)cookie獲取

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

2.我們還可以針對(duì)所有的AJAX請(qǐng)求統(tǒng)一配置,這樣在執(zhí)行AJAX發(fā)送之前 會(huì)自動(dòng)執(zhí)行下面的代碼

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

除了通過(guò)中間件全局的配置CSRF,我們還可以進(jìn)行局部的調(diào)整,允許或者不允許執(zhí)行CSRF。

Django提供了兩個(gè)裝飾器函數(shù) csrf_exempt 和csrf_protector。

我們?nèi)绻P(guān)閉了全局的CSRF,但是又希望對(duì)個(gè)別函數(shù)進(jìn)行保護(hù),可以在對(duì)應(yīng)的函數(shù)上面使用csrf_protector這個(gè)裝飾器。(不推薦)

例如:

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect
def index(request):
    print(request.session)

另外一個(gè)情況就是,我們打開(kāi)了全局的CSRF,但是希望對(duì)個(gè)別函數(shù)不進(jìn)行保護(hù),那么使用csrf_exempt

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

文章名稱(chēng):DjangoCSRF簡(jiǎn)述-創(chuàng)新互聯(lián)
文章地址:http://muchs.cn/article12/dspedc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)建站、微信小程序、云服務(wù)器、品牌網(wǎng)站設(shè)計(jì)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司