1. 程式人生 > 實用技巧 >django框架之自定義中介軟體及csrf跨站請求偽造等相關內容-75

django框架之自定義中介軟體及csrf跨站請求偽造等相關內容-75

今日內容

1 django的session原理流程

2 自定義中介軟體

1 自定義步驟:
-寫一個類,繼承MiddlewareMixin
-裡面寫方法process_request(請求來了,一定會觸發它的執行)
-在setting中配置(注意,放在前和放在後)
MIDDLEWARE = [
...
'app01.mymiddle.MyMiddleware1',
...
]

3 process_request,process_response,process_view,process_exception

1 process_request(request物件)
2 process_response(request物件,response物件)
3 多箇中間件,執行順序是什麼?
-請求來的時候從上往下執行:process_request
-請求走的時候,從下往上執行:process_response


4 process_request可以幹什麼?
-寫一箇中間件,不管前端用什麼編碼,在requset.data中都有post的資料
-頻率限制(限制某個ip地址,一分鐘只能訪問5次)
-登入認證(只要沒登入,重定向到login路徑)、
-記錄使用者訪問日誌(ip,時間,訪問路徑)

5 process_response可以幹什麼?內部有response物件
-統一給所有(某幾個路徑)加cookie
-統一給所有(某幾個路徑)加響應頭



6 process_view 路由匹配成功和檢視函式執行之前執行(callback就是檢視函式)
def process_view(self, request, callback, callback_args, callback_kwargs):
# print(callback)
# print(callback_args)
# print(callback_kwargs)
#
res=callback(request)
#
print("中介軟體1的process_view")
return res
7 process_exception 檢視函數出錯,會執行它(全域性異常捕獲)(記錄日誌,哪個ip地址,訪問哪個路徑,出的錯)
# 全域性異常捕獲,返回4開頭的
def process_exception(self, request, exception):
print(exception)
return render(request,'error.html')

4 CSRF_TOKEN跨站請求偽造

1 跨站請求偽造
2 程式碼演示


3 django解決了csrf攻擊,中介軟體:django.middleware.csrf.CsrfViewMiddleware


4 後期中介軟體不能註釋,每次傳送post請求,都需要攜帶csrf_token隨機字串
-form表單提交
-在form表單中 {% csrf_token%}

-ajax提交(如何攜帶)
方式一:放到data中
$.ajax({
url: '/csrf_test/',
method: 'post',
data: {'name': $('[name="name"]').val(),
'password': $('[name="password"]').val(),
'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()
},
success: function (data) {
console.log('成功了')
console.log(data)

},
error: function (data) {
console.log('xxxxx')
console.log(data)

}
})
方式二:放到data中
'csrfmiddlewaretoken':'{{ csrf_token }}'
方式三:放到頭中
headers:{'X-CSRFToken':'{{csrf_token}}'},


# jquery.cookie.js
-在瀏覽器中對cookie進行增,刪,查,改
-前後端分離(js操作cookie)



# 全域性使用,區域性禁csrf
-在檢視函式上加裝飾器
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 全域性啟用,區域性禁用(中介軟體不能註釋,這個檢視函式,已經沒有csrf校驗了)
# @csrf_exempt
# def csrf_test(request):
# if request.method=='GET':
# return render(request,'csrf_test.html')
# else:
# name=request.POST.get('name')
# password=request.POST.get('password')
# print(name)
# print(password)
# return HttpResponse('登入成功')

# 全域性禁用,區域性使用csrf
@csrf_protect
def csrf_test(request):
if request.method=='GET':
return render(request,'csrf_test.html')
else:
name=request.POST.get('name')
password=request.POST.get('password')
print(name)
print(password)
return HttpResponse('登入成功')



# 古怪的使用方式,在urls.py中
path('csrf_test/', csrf_exempt(views.csrf_test))