csrf

分類:ajax

django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。django

全局:後端

中間件 django.middleware.csrf.CsrfViewMiddleware服務器

局部:cookie

@csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。前後端分離

@csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。dom

Django中CSRF防禦原理:函數

在用戶訪問django的可信站點時,django反饋給用戶的表單中有一個隱含字段csrftoken,這個值是在服務器端隨機生成的,每一次提交表單都會生成不一樣的值。當用戶提交django的表單時,服務器校驗這個表單的csrftoken是否和本身保存的一致,來判斷用戶的合法性。當用戶被csrf攻擊從其餘站點發送精心編制的攻擊請求時,因爲其餘站點不可能知道隱藏的csrftoken字段的信息這樣在服務器端就會校驗失敗,攻擊被成功防護,這樣就能避免被 CSRF 攻擊。csrf

在返回的 HTTP 響應的 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

設置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 去調用的話  須要在傳遞的參數裏帶上    csrfmiddlewaretoken: "{{ csrf_token }}"

相關文章
相關標籤/搜索