csrf 功能 及 csrf裝飾器使用


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
  • 使用實例
#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的值,比較成功接收請求,比較不成功拒絕請求。

作 者: 郭楷豐
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角 推薦一下。您的鼓勵是博主的最大動力!
自 勉:生活,需要追求;夢想,需要堅持;生命,需要珍惜;但人生的路上,更需要堅強。 帶着感恩的心啟程,學會愛,愛父母,愛自己,愛朋友,愛他人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM