分類:
django為用戶實現(xiàn)防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成床三。而對于django中設(shè)置防跨站請求偽造功能有分為全局和局部。
全局:
中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect蜡吧,為當前函數(shù)強制設(shè)置防跨站請求偽造功能,即便settings中沒有設(shè)置全局中間件。
@csrf_exempt卷中,取消當前函數(shù)防跨站請求偽造功能盾似,即便settings中設(shè)置了全局中間件敬辣。
Django中CSRF防護原理:
在用戶訪問django的可信站點時,django反饋給用戶的表單中有一個隱含字段csrftoken零院,這個值是在服務(wù)器端隨機生成的溉跃,每一次提交表單都會生成不同的值。當用戶提交django的表單時告抄,服務(wù)器校驗這個表單的csrftoken是否和自己保存的一致撰茎,來判斷用戶的合法性。當用戶被csrf攻擊從其他站點發(fā)送精心編制的攻擊請求時打洼,由于其他站點不可能知道隱藏的csrftoken字段的信息這樣在服務(wù)器端就會校驗失敗龄糊,攻擊被成功防御,這樣就能避免被 CSRF 攻擊拟蜻。
在返回的 HTTP 響應(yīng)的 cookie 里绎签,django 會為你添加一個 csrftoken 字段,其值為一個自動生成的 token
在所有的 POST 表單時酝锅,必須包含一個 csrfmiddlewaretoken 字段 (只需要在模板里加一個 tag诡必, django 就會自動幫你生成,見下面)
在處理 POST 請求之前,django 會驗證這個請求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣爸舒。如果一樣蟋字,則表明這是一個合法的請求,否則扭勉,這個請求可能是來自于別人的 csrf 攻擊鹊奖,返回 403 Forbidden.
在所有 ajax POST 請求里,添加一個 X-CSRFTOKEN header涂炎,其值為 cookie 里的 csrftoken 的值
Django中使用 CSRF 防護
GET 請求不要用有副作用忠聚。任何處理 GET 請求的代碼對資源的訪問都一定要是“只讀“的。
啟用 django.middleware.csrf.CsrfViewMiddleware 中間件
使用POST 表單元素時唱捣,加上{% csrf_token %}
渲染模塊使用 RequestContext两蟀。RequestContext 會處理 csrf_token , 從而自動為表單添加一個名為 csrfmiddlewaretoken 的 input
Django中CSRF防護解析:
csrftoken的生成方式如下:
md5_constructor("%s%s"% (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()
1
設(shè)置csrftoken:
response.set_cookie(settings.CSRF_COOKIE_NAME,request.META["CSRF_COOKIE"], max_age =60*60*24*7*52, domain=settings.CSRF_COOKIE_DOMAIN)
1
csrftoken與cookie中的token比較:
ifnotconstant_time_compare(request_csrf_token, csrf_token):對于前后端分離的 ajax 去調(diào)用的話? 需要在傳遞的參數(shù)里帶上? ? csrfmiddlewaretoken: "{{ csrf_token }}"