1. 程式人生 > 實用技巧 >Django的POST請求時因為開啟防止csrf,報403錯誤,及四種解決方法

Django的POST請求時因為開啟防止csrf,報403錯誤,及四種解決方法

Django預設開啟防止csrf(跨站點請求偽造)攻擊,在post請求時,沒有上傳csrf欄位,導致校驗失敗,報403錯誤

解決方法1:

註釋掉此段程式碼,即可。

缺點:導致Django專案完全無法防止csrf攻擊

解決方法2:

在views.py檔案中

#匯入,可以使此次請求忽略csrf校驗
from django.views.decorators.csrf import csrf_exempt

#在處理函式加此裝飾器即可
@csrf_exempt
def post(request):
     name=request.post['name']
     return HttpResponse('welcome!{}'.format(name))

缺點:導致此次請求無法防止csrf攻擊,但是比第一種好很多

解決方法3:

針對使用模版進行開發的MTV模式,在模版檔案提交form表單程式碼中新增

但是本人不使用MTV模式進行開發,只使用Restful模式,所以對於Restfu模式開發的,使用第四種解決方法。

解決方法4:

django的csrf安全工作順序是:先從後臺獲取csrf_token併發送給前端,然後前端在進行form表單提交時,把帶有名為csrfmiddlewaretoken,值為csrf_token 的欄位一起傳送給後端進行校驗。

所以此解決方案便是按照此邏輯,先通過一個介面獲取csrf_token,然後在form表單中一起提交給後端校驗

from django.template.context_processors import csrf

def get_csrf(request):
        #生成 csrf 資料,傳送給前端
    x = csrf(request)
    csrf_token = x['csrf_token']
    return HttpResponse('{} ; {}'.format(str(re), csrf_token))

然後在另一個POST請求中加引數 名為:csrfmiddlewaretoken 值為get_csrf函式返回的csrf_token ,這樣校驗便成功

優點:完成了csrf安全校驗