csrf 功能 及 csrf裝飾器使用

  • 2019 年 10 月 8 日
  • 筆記

目錄

csrf 功能 及 csrf裝飾器使用

簡單了解csrf

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為「One Click Attack」或者Session Riding,  通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS非常不同,  XSS利用站點內的信任用戶,而CSRF則通過偽裝成受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,  CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。

防範措施 了解更多csrf點擊

對於web站點,將持久化的授權方法(例如cookie或者HTTP授權)切換為瞬時的授權方法(在每個form中提供隱藏field),  這將幫助網站防止這些攻擊。一種類似的方式是在form中包含秘密資訊、用戶指定的代號作為cookie之外的驗證。  另一個可選的方法是「雙提交」cookie。此方法只工作於Ajax請求,但它能夠作為無需改變大量form的全局修正方法。  如果某個授權的cookie在form post之前正被JavaScript程式碼讀取,那麼限制跨域規則將被應用。  如果伺服器需要在Post請求體或者URL中包含授權cookie的請求,那麼這個請求必須來自於受信任的域,  因為其它域是不能從信任域讀取cookie的。  與通常的信任想法相反,使用Post代替Get方法並不能提供卓有成效的保護。因為JavaScript能使用偽造的POST請求。  儘管如此,那些導致對安全產生「副作用」的請求應該總使用Post方式發送。Post方式不會在web伺服器和代理伺服器日誌中留下數據尾巴,  然而Get方式卻會留下數據尾巴。  儘管CSRF是web應用的基本問題,而不是用戶的問題,但用戶能夠在缺乏安全設計的網站上保護他們的帳戶:  通過在瀏覽其它站點前登出站點或者在瀏覽器會話結束後清理瀏覽器的cookie。

django 中 csrf

  • 配置文件
  • form表單使用

csrf裝飾器

from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie#導入方法  csrf_exempt         #某個視圖函數不需要進行csrf校驗  csrf_protect        #某個視圖函數需要進行csrf校驗  ensure_csrf_cookie  #確保生成csrf的cookie
  • csrf_exempt使用實例 不需要效驗
#setting中CSRF中間件未注釋  #使用方法一  from django.views import View  from django.shortcuts import render, redirect, HttpResponse  from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie    class Login(View):      @method_decorator(csrf_exempt) #csrf_exempt只能載入dispatch上才有效果,所有的方法都不需要驗證      def dispatch(self, request, *args, **kwargs):          ret = super().dispatch(request, *args, **kwargs)          return ret      def get(self, request, *args, **kwargs):          pass      def post(self, request, *args, **kwargs):          pass    #使用方法二  from django.views import View  from django.shortcuts import render, redirect, HttpResponse  from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie    @method_decorator(csrf_exempt,name="dispatch")  class Login(View):      def get(self, request, *args, **kwargs):          pass      def post(self, request, *args, **kwargs):          pass  #使用方法三  把csrf_exempt裝飾器直接加在URL路由映射中,使某個視圖函數不經過CSRF驗證  from users import views  from django.views.decorators.csrf import csrf_exempt    urlpatterns = [      url(r'^admin/', admin.site.urls),      url(r'^index/',csrf_exempt(views.index)),  ]    #FBV使用直接加就行  @csrf_exempt  def index(request):      pass
  • csrf_protect 需要效驗 ensure_csrf_cookie 確保生成csrf的cookie
  • 使用實例
#setting中CSRF中間件已注釋  from django.views import View  from django.shortcuts import render, redirect, HttpResponse  from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie    class Login(View):      @@method_decorator(ensure_csrf_cookie)      def get(self, request, *args, **kwargs):          pass      @method_decorator(csrf_protect)#post需要效驗      def post(self, request, *args, **kwargs):          pass    #FBV使用直接加就行  @csrf_protect  def index(request):      pass

csrf功能(執行流程)

  • csrf中間件中執行process_request
    • 1 從cookie中獲取到csrftoken的值
    • 2 csrftoken的值放入到 request.META
  • 執行process_view
    • 1 查詢視圖函數是否使用csrf_exempt裝飾器,使用了就不進行csrf的校驗
    • 2 判斷請求方式:
      • 1 如果是GET', 'HEAD', 'OPTIONS', 'TRACE' 不進行csrf校驗
      • 2 其他的請求方式(post,put)
        • 進行csrf校驗:
        • 獲取cookie中csrftoken的值
        • 獲取csrfmiddlewaretoken的值
          • 能獲取到 ——》 request_csrf_token
          • 獲取不到 ——》 獲取請求頭中X-csrftoken的值 ——》request_csrf_token
          • 比較上述request_csrf_token和cookie中csrftoken的值,比較成功接收請求,比較不成功拒絕請求。

作 者:郭楷豐