什么是 CSRF
CSRF, Cross Site Request Forgery, 跨站點(diǎn)偽造請(qǐng)求。舉例來講,某個(gè)惡意的網(wǎng)站上有一個(gè)指向你的網(wǎng)站的鏈接,如果某個(gè)用戶已經(jīng)登錄到你的網(wǎng)站上了,那么當(dāng)這個(gè)用戶點(diǎn)擊這個(gè)惡意網(wǎng)站上的那個(gè)鏈接時(shí),就會(huì)向你的網(wǎng)站發(fā)來一個(gè)請(qǐng)求,你的網(wǎng)站會(huì)以為這個(gè)請(qǐng)求是用戶自己發(fā)來的,其實(shí)呢,這個(gè)請(qǐng)求是那個(gè)惡意網(wǎng)站偽造的。
1.csrf原理
csrf要求發(fā)送post,put或delete請(qǐng)求的時(shí)候,是先以get方式發(fā)送請(qǐng)求,服務(wù)端響應(yīng)時(shí)會(huì)分配一個(gè)隨機(jī)字符串給客戶端,客戶端第二次發(fā)送post,put或delete請(qǐng)求時(shí)攜帶上次分配的隨機(jī)字符串到服務(wù)端進(jìn)行校驗(yàn)
2.Django中的CSRF中間件
首先,我們知道Django中間件作用于整個(gè)項(xiàng)目。
在一個(gè)項(xiàng)目中,如果想對(duì)全局所有視圖函數(shù)或視圖類起作用時(shí),就可以在中間件中實(shí)現(xiàn),比如想實(shí)現(xiàn)用戶登錄判斷,基于用戶的權(quán)限管理(RBAC)等都可以在Django中間件中來進(jìn)行操作
Django內(nèi)置了很多中間件,其中之一就是CSRF中間件
MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]
上面第四個(gè)就是Django內(nèi)置的CSRF中間件
3.Django中間件的執(zhí)行流程
Django中間件中最多可以定義5個(gè)方法
process_request process_response process_view process_exception process_template_responseDjango中間件的執(zhí)行順序
1.請(qǐng)求進(jìn)入到Django后,會(huì)按中間件的注冊(cè)順序執(zhí)行每個(gè)中間件中的process_request方法
如果所有的中間件的process_request方法都沒有定義return語句,則進(jìn)入路由映射,進(jìn)行url匹配
否則直接執(zhí)行return語句,返回響應(yīng)給客戶端
2.依次按順序執(zhí)行中間件中的process_view方法
如果某個(gè)中間件的process_view方法沒有return語句,則根據(jù)第1步中匹配到的URL執(zhí)行對(duì)應(yīng)的視圖函數(shù)或視圖類
如果某個(gè)中間件的process_view方法中定義了return語句,則后面的視圖函數(shù)或視圖類不會(huì)執(zhí)行,程序會(huì)直接返回
3.視圖函數(shù)或視圖類執(zhí)行完成之后,會(huì)按照中間件的注冊(cè)順序逆序執(zhí)行中間件中的process_response方法
如果中間件中定義了return語句,程序會(huì)正常執(zhí)行,把視圖函數(shù)或視圖類的執(zhí)行結(jié)果返回給客戶端
否則程序會(huì)拋出異常
4.程序在視圖函數(shù)或視圖類的正常執(zhí)行過程中
新聞熱點(diǎn)
疑難解答
圖片精選