目錄
- 引入:
- Ajax請(qǐng)求設(shè)置csrf_token的三種方式
- csrf裝飾器
- csrf裝飾器作用在FBV上
- csrf裝飾器作用在CBV上
引入:
通常,釣魚(yú)網(wǎng)站本質(zhì)是本質(zhì)搭建一個(gè)跟正常網(wǎng)站一模一樣的頁(yè)面,用戶(hù)在該頁(yè)面上完成轉(zhuǎn)賬功能
轉(zhuǎn)賬的請(qǐng)求確實(shí)是朝著正常網(wǎng)站的服務(wù)端提交,唯一不同的在于收款賬戶(hù)人不同。
如果想模擬一個(gè)釣魚(yú)網(wǎng)站,就可是給用戶(hù)書(shū)寫(xiě)一個(gè)form表單 對(duì)方賬戶(hù)的input框沒(méi)有name屬性,然后你自己悄悄提前寫(xiě)好了一個(gè)具有默認(rèn)的并且是隱藏的具有name屬性的input框。
如果想解決這個(gè)問(wèn)題,當(dāng)轉(zhuǎn)賬請(qǐng)求發(fā)送給服務(wù)端后,服務(wù)端會(huì)給各臺(tái)機(jī)器返回一個(gè)隨機(jī)實(shí)時(shí)字符串。下一次,如果還有請(qǐng)求向服務(wù)端發(fā)時(shí),服務(wù)端會(huì)校驗(yàn)字符串,若對(duì)不上的話服務(wù)端就拒絕訪問(wèn)。這就是csrf校驗(yàn)。
那么form表單如何進(jìn)行csrf校驗(yàn)?zāi)兀?/p>
你只需要在你的form表單內(nèi)寫(xiě)一個(gè){% csrf_token %}就可以了
Ajax請(qǐng)求設(shè)置csrf_token的三種方式
示例:
urls.py
urlpatterns = [
url(r'^transfer/', views.transfer),
]
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
第三種方式的js文件(官方文檔套用就行了)
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;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
views.py
def transfer(request):
if request.method =='POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print('%s 給 %s 轉(zhuǎn)賬 %s元' %(username,target_user,money))
return render(request,'transfer.html')
前端頁(yè)面 transfer.html
!DOCTYPE html>
html lang="en">
head>
meta charset="UTF-8">
title>Title/title>
script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js">/script>
link rel="external nofollow" rel="stylesheet">
script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js">/script>
/head>
body>
form action="" method="post">
{% csrf_token %}
p>username:input type="text" name="username">/p>
p>target_user:input type="text" name="target_user">/p>
p>money:input type="text" name="money">/p>
input type="submit">
/form>
button id="d1">發(fā)送ajax請(qǐng)求/button>
{% load static %}
script src="{% static 'myfile.js' %}">/script>
script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
// 第一種方式 自己手動(dòng)獲取
{#data:{'username':'jason','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 第二種方式 利用模板語(yǔ)法
{#data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},#}
// 第三種 通用方式 引入外部js文件
data:{'username':'hank'},
success:function (data) {
alert(data)
}
})
})
/script>
/body>
/html>
csrf裝飾器
csrf裝飾器作用在FBV上
裝飾器模塊導(dǎo)入:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
當(dāng)我們網(wǎng)站整體都校驗(yàn)csrf的時(shí)候 我想讓某幾個(gè)視圖函數(shù)不校驗(yàn)
@csrf_exempt #給哪個(gè)視圖函數(shù)加上,就不給哪個(gè)視圖校驗(yàn)csrf
當(dāng)我們網(wǎng)站整體都不校驗(yàn)csrf的時(shí)候 我想讓某幾個(gè)視圖函數(shù)校驗(yàn)
@csrf_protect #給哪個(gè)視圖函數(shù)加上,就給哪個(gè)視圖校驗(yàn)csrf
注意:驗(yàn)證同時(shí)需要把'django.middleware.csrf.CsrfViewMiddleware'注銷(xiāo)掉
csrf裝飾器作用在CBV上
當(dāng)我們網(wǎng)站整體都不校驗(yàn)csrf的時(shí)候 我想讓某幾個(gè)視圖函數(shù)校驗(yàn)
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @method_decorator(csrf_protect,name='post') #第二種指名道姓地給某給方法裝
class MyHome(View):
@method_decorator(csrf_protect) #第三種 給類(lèi)中所有的方法都裝
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return HttpResponse('get')
# @method_decorator(csrf_protect) #第一種方式
def post(self,request):
return HttpResponse('post')
注意:驗(yàn)證同時(shí)需要把'django.middleware.csrf.CsrfViewMiddleware'注銷(xiāo)掉
當(dāng)我們網(wǎng)站整體都校驗(yàn)csrf的時(shí)候 我想讓某幾個(gè)視圖函數(shù)不校驗(yàn)
總結(jié):給CBV加裝飾器 推薦使用模塊method_decorator
csrf_exempt 只能給dispatch方法裝
到此這篇關(guān)于Django csrf校驗(yàn)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Django csrf校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!