最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django CSRF跨站請求偽造防護過程解析

 更新時間:2019年07月31日 09:13:50   作者:Tanglaoer  
這篇文章主要介紹了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ù)用戶的權限做具體的操作邏輯。

防范措施

1、在指定表單或者請求頭的里面添加一個隨機值做為參數(shù)。

2、在響應的cookie里面也設置該隨機值。

3、用戶正常提交表單的時候會默認帶上表單中的隨機值,瀏覽器會自動帶上cookie里面的隨機值,那么服務器下次接受到請求之后就可以取出兩個值進行校驗。

4、對于網(wǎng)站B來說網(wǎng)站B在提交表單的時候不知道該隨機值是什么,所以就形成不了攻擊。

Django中CSRF中間件

django在創(chuàng)建項目的時候,默認就會有添加中間進行CSRF的保護,在MIDDLEWARE可以看到加載了 django.middleware.csrf.CsrfViewMiddleware 的中間件,這里是全局設置,也可以局部設置。

全局保護:直接啟用中間件就可以了。

局部保護: from django.views.decorators.csrf import csrf_exempt,csrf_protect ,使用裝飾器進行驗證。

csrf_protect :為當前函數(shù)強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件;

csrf_exempt :取消當前函數(shù)防跨站請求偽造功能,即便settings中設置了全局中間件。

驗證

在POST請求提交數(shù)據(jù)的時候,django會去檢查是否有一個csrf的隨機字符串,如果沒有就會返回403沒有權限訪問。

表單驗證

在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里面設置。

from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
  path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

灌阳县| 光山县| 中宁县| 密山市| 车致| 大城县| 巩留县| 铜鼓县| 辽源市| 越西县| 南京市| 沁水县| 建阳市| 平武县| 礼泉县| 唐海县| 平乡县| 长治市| 莱西市| 玉环县| 邹平县| 天柱县| 崇仁县| 宁津县| 临沂市| 随州市| 华坪县| 双峰县| 连平县| 神农架林区| 乌拉特后旗| 神农架林区| 沐川县| 朝阳县| 阳春市| 灌南县| 金川县| 宁国市| 手机| 郑州市| 宕昌县|