Django csrf校驗(yàn)的實(shí)現(xiàn)
引入:
通常,釣魚網(wǎng)站本質(zhì)是本質(zhì)搭建一個(gè)跟正常網(wǎng)站一模一樣的頁面,用戶在該頁面上完成轉(zhuǎn)賬功能
轉(zhuǎn)賬的請(qǐng)求確實(shí)是朝著正常網(wǎng)站的服務(wù)端提交,唯一不同的在于收款賬戶人不同。
如果想模擬一個(gè)釣魚網(wǎng)站,就可是給用戶書寫一個(gè)form表單 對(duì)方賬戶的input框沒有name屬性,然后你自己悄悄提前寫好了一個(gè)具有默認(rèn)的并且是隱藏的具有name屬性的input框。
如果想解決這個(gè)問題,當(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ù)端就拒絕訪問。這就是csrf校驗(yàn)。
那么form表單如何進(jìn)行csrf校驗(yàn)?zāi)兀?/p>
你只需要在你的form表單內(nèi)寫一個(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')
前端頁面 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()},#} // 第二種方式 利用模板語法 {#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'注銷掉
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) #第三種 給類中所有的方法都裝 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'注銷掉
當(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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例例如直接插入排序、直接選擇排序、冒泡排序、快速排序等,需要的朋友可以參考下2014-06-06對(duì)Pycharm創(chuàng)建py文件時(shí)自定義頭部模板的方法詳解
今天小編就為大家分享一篇對(duì)Pycharm創(chuàng)建py文件時(shí)自定義頭部模板的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python?dateutil庫簡化日期時(shí)間處理利器使用場(chǎng)景實(shí)踐
在Python中,處理日期和時(shí)間是常見的任務(wù)之一,dateutil庫是Python標(biāo)準(zhǔn)庫中datetime模塊的擴(kuò)展,提供了許多方便的工具和函數(shù),簡化了日期和時(shí)間的操作2023-12-12Python小程序 控制鼠標(biāo)循環(huán)點(diǎn)擊代碼實(shí)例
這篇文章主要介紹了Python小程序 控制鼠標(biāo)循環(huán)點(diǎn)擊代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Python web開發(fā)之用Tornado框架制作簡易表白墻網(wǎng)站
這篇文章將用Python做Web開發(fā)。在Python當(dāng)中,WEB開發(fā)框架主要有三個(gè),本文將利用Tornado框架做一個(gè)簡單的表白墻網(wǎng)站,感興趣的可以了解一下2022-02-02python實(shí)現(xiàn)LRU熱點(diǎn)緩存及原理
LRU算法根據(jù)數(shù)據(jù)的歷史訪問記錄來進(jìn)行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高”。 。這篇文章主要介紹了python實(shí)現(xiàn)LRU熱點(diǎn)緩存,需要的朋友可以參考下2019-10-10Python高級(jí)特性之切片迭代列表生成式及生成器詳解
這篇文章主要為大家介紹了Python高級(jí)特性之切片迭代列表生成式及生成器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10python開發(fā)之tkinter實(shí)現(xiàn)圖形隨鼠標(biāo)移動(dòng)的方法
這篇文章主要介紹了python開發(fā)之tkinter實(shí)現(xiàn)圖形隨鼠標(biāo)移動(dòng)的方法,涉及Python基于tkinter繪圖的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11