Django CSRF跨站請求偽造防護過程解析
前言
CSRF全稱Cross-site request forgery(跨站請求偽造),是一種網(wǎng)絡的攻擊方式,也被稱為“One Click Attack”或者Session Riding,通??s寫為CSRF或者XSRF。
攻擊原理
1、用戶訪問正常的網(wǎng)站A,瀏覽器就會保存網(wǎng)站A的cookies。
2、用戶在訪問惡意網(wǎng)站B, 網(wǎng)站B上有某個隱藏的鏈接會自動請求網(wǎng)站A的鏈接地址,例如表單提交,傳指定的參數(shù)。
3、惡意網(wǎng)站B的自動化請求,執(zhí)行就是在用戶A的同一個瀏覽器上,因此在訪問網(wǎng)站A的時候,瀏覽器會自動帶上網(wǎng)站A的cookies。
4、所以網(wǎng)站A在接收到請求之后,可判斷當前用戶登錄狀態(tài),所以根據(jù)用戶的權(quán)限做具體的操作邏輯。
防范措施
1、在指定表單或者請求頭的里面添加一個隨機值做為參數(shù)。
2、在響應的cookie里面也設(shè)置該隨機值。
3、用戶正常提交表單的時候會默認帶上表單中的隨機值,瀏覽器會自動帶上cookie里面的隨機值,那么服務器下次接受到請求之后就可以取出兩個值進行校驗。
4、對于網(wǎng)站B來說網(wǎng)站B在提交表單的時候不知道該隨機值是什么,所以就形成不了攻擊。
Django中CSRF中間件
django在創(chuàng)建項目的時候,默認就會有添加中間進行CSRF的保護,在MIDDLEWARE可以看到加載了 django.middleware.csrf.CsrfViewMiddleware 的中間件,這里是全局設(shè)置,也可以局部設(shè)置。
全局保護:直接啟用中間件就可以了。
局部保護: from django.views.decorators.csrf import csrf_exempt,csrf_protect ,使用裝飾器進行驗證。
csrf_protect :為當前函數(shù)強制設(shè)置防跨站請求偽造功能,即便settings中沒有設(shè)置全局中間件;
csrf_exempt :取消當前函數(shù)防跨站請求偽造功能,即便settings中設(shè)置了全局中間件。
驗證
在POST請求提交數(shù)據(jù)的時候,django會去檢查是否有一個csrf的隨機字符串,如果沒有就會返回403沒有權(quán)限訪問。
表單驗證
在form表單里面需要添加{%csrf_token%},Django會自動渲染隱藏的input輸入框:
<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">
在表單提交的時候,中間件會驗證csrfmiddlewaretoken。
通過ajax提交
通過cookies獲取到csrftoken,
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
$.ajax({
url:"/api/v1.0/orders",
type:"POST",
data: JSON.stringify(data),
contentType: "application/json",
dataType: "json",
headers:{
"X-CSRFtoken":getCookie("csrf_token"),
},
局部禁用或者啟用
1、如果是函數(shù)視圖,可以直接在函數(shù)加上裝飾器即可:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
return HttpResponse('ok')
2、如果是類視圖,需要使用方法裝飾器進行封裝
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views.generic import TemplateView
@method_decorator(csrf_exempt)
class LoginView(TemplateView):
template_name = 'login.html'
def post():
return HttpResponse('ok')
3、直接裝飾as_view()方式,在URLconf里面設(shè)置。
from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)讀取大量Excel文件并跨文件批量計算平均值
這篇文章主要為大家詳細介紹了如何利用Python語言,實現(xiàn)對多個不同Excel文件進行數(shù)據(jù)讀取與平均值計算的方法,感興趣的可以了解一下2023-02-02
Mysql分組查詢group by與with rollup方式
這篇文章主要介紹了Mysql分組查詢group by與with rollup方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
PyQt5 QTreeWidget 樹形結(jié)構(gòu)遞歸遍歷當前所有節(jié)點的實現(xiàn)
Qt中實現(xiàn)樹形結(jié)構(gòu)可以使用QTreeWidget類,也可以使用QTreeView類,本文主要介紹了PyQt5 QTreeWidget 樹形結(jié)構(gòu)遞歸遍歷當前所有節(jié)點的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
python之tensorflow手把手實例講解斑馬線識別實現(xiàn)
目前智慧城市的發(fā)展,人們生活處處有科技,比如人臉識別,智慧交通,無人駕駛等前沿的科技產(chǎn)品也都融入了人們生活中;本篇文章帶你從頭開始實現(xiàn)斑馬線識別2021-09-09

