CSRF(XSRF)和CBV的介紹和防護
阿新 • • 發佈:2018-02-26
csrf django CSRF概念:CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來理解:
攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發送郵件、發消息,盜取你的賬號,添加系統管理員,甚至於購買商品、虛擬貨幣轉賬等。 如下:其中Web A為存在CSRF漏洞的網站,Web B為攻擊者構建的惡意網站,User C為Web A網站的合法用戶。
攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發送郵件、發消息,盜取你的賬號,添加系統管理員,甚至於購買商品、虛擬貨幣轉賬等。 如下:其中Web A為存在CSRF漏洞的網站,Web B為攻擊者構建的惡意網站,User C為Web A網站的合法用戶。
代碼設計
url(r‘^csrf1.html/‘, views.csrf1),
def csrf1(request): if request.method == "GET": return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>csrf1.html</title> </head> <body> <form action="csrf1.html" method="POST"> {% csrf_token %}#獲取csrf_token,並且生成了一個隱藏的input標簽 {{ csrf_token }}#這個是顯示csrf_token,自己測試看看 <input type="text"/> <input type="submit" value="提交"> </form> </body> </html>
在django裏面打開csrf機制
通過瀏覽器訪問http://127.0.0.1:8000/csrf1.html,如果沒有開啟這個csrf機制,關閉以後就不會認證。開啟後,不獲取隨機csrf_token就會報錯
csrf是隨機的一個字符串,會發給服務端,然後再次訪問的時候帶著這個字符串
如果想讓某一個函數不驗證了,其他的使用怎麽操作?????
要想完成上面的操作,需要添加一個裝飾器,如下
from django.views.decorators.csrf import csrf_exempt #導入這個模塊 @csrf_exempt#添加裝飾器 def csrf1(request): if request.method == "GET": return render(request,‘csrf1.html‘) else: return HttpResponse(‘ok‘)
全局禁用,局部使用,怎麽操作????
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @csrf_exempt
@csrf_protect#局部使用
def csrf1(request):
if request.method == "GET":
return render(request,‘csrf1.html‘)
else:
return HttpResponse(‘ok‘)
上面的這些都是FBV裏面的操作,下面我們隊CBV如何操作那
在django中的cbv裏面,添加裝飾器是有不一樣的地方的,它需要把裝飾器當成參數傳遞給另外一個模塊中的,如下面
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect)
class Foo(View):
def get(self,request):
pass
def post(self,request):
pass
django 版本為1.913的導入View是這樣的:from django.views.generic.base import View
也可以通過下面的方式加
還可以指定那個添加
也可以通過dispatch來全部加上(cbv 的原理dispatch)
註意針對csrf,只能添加到類上面,
ajax發送csrftoken
第一種方法
ajax提交數據時候,攜帶csrf。值獲取到,然後通過data攜帶
通過cookie
需要插件jquery.cookies.js插件
$.cooike(‘csrftocken‘)這個是獲取,擔任也可以設置
CSRF(XSRF)和CBV的介紹和防護