django CSRF | xss攻击
一、CSRF corss-site request forgery
csrf 引发的问题:
CSRF 攻击:
跨站请求攻击指的是,例如:你在登录进入银行的同时,又打开了一个B网站(恶意网站 )的页面, 这就有可能你的转帐操作的资金会转帐到 黑客的帐户中(只是有可能。) 因为 在登录进入银行的页面时候,银行服务器已经发了一个cookie 过来给你,而你在这个页面没有退出银行,并且还开了一个不知所谓的网站(B网站) ,这个时候黑客网站就有可能将你的银行cookie .获取到,并且他还知道转帐页面的URL,并将这个URL中的转帐帐户改为他的帐户,还修改还资金,这个时候你钱可能就莫名其妙的少了甚至没了。 因为在这一整个过程中,你没有退出银行, cookie 还在,cookie 里存的都是一些敏感信息(帐号、密码等), 黑客带着你的cookie 直接就给了服务器一个转帐请求。
但是,真正的过程远比上述要复杂很多,因为现在我们登录银行以后,这是拿到了第一个cookie ,即使被黑客拿到了这个cookie ----没用,因为在进行下一步操作的时候(查询余额 这种都没有涉及到数据的修改,黑客无法拿到的。) ,例如转帐---> 有数据的操作但是,你转帐的时候有二层防护,需要你的输入手机验证码,这个只有你自己才知道验证码了, 这个黑客拿到这两个条件的机率 相当小了。
服务器端也做一些验证,除了客户端 带着cookie来访问以外,还可以验证用户端的referer ,假如 浏览器端的referer 来自另外的任何网站,都不让操作。
总结:
被攻击须满足两个条件:
1、登录信任网站,并生成cookie
2、在不登出信任网站的前提下,还访问了(危险网站)B网站。
csrf 并不能完全的防范住攻击者,如 果网站还有其它漏洞 如XSS ,那CSRF 防线形同虚设。
一、django 中开启 csrf : 中间件里打开表示 ,全站使用,如果需要只在局部使用
开启以后,需要在 views.py 下做一个相应处理的函数。
二、在django中局部使用csrftoken fbv. cbv 两种方式,必须对此做一些相应的处理:
1】FBV . 处理方式:
#FBV 中使用 CSRF from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_exempt def csrf1(request): if request.method=='GET': return render(request,'csrf1.html',{'data':1}) # return HttpResponse('haode') else: print(request.POST.get('csrfmiddlewaretoken'),'i"m token') # return render(request, 'csrf1.html', {'data': 1}) return HttpResponse('kl')
获取到token .值的结果:
2】urls.py
from django.conf.urls import url from django.contrib import admin from pratice import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/',views.test), url(r'^csrf1.html/',views.csrf1), url(r'^foo/',views.foo.as_view()),#cbv 写法 ]
3】html文件,中获取cookie
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href=""> </head> <body> <form action="/csrf1" method="POST"> {% csrf_token %} <!-- FBV 中使用; 就只加这一个 %% 就可以使用了 1 、基本应用就是在 form 表单中添加 2、局部禁用: 如果不在这个页面使用 csrf 验证 ,只需要在views 处理函数加装饰器 @csrf_exempt 3、全局禁用 settings 文件注释 4、局部应用 views 下处理函数 加 @csrf_protect cbv 中使用: @method_decorator(csrf_protect) 加在 views的处理函数上 --> <input id="user" type="text" name="user"> <input type="submit" value="提交" onclick="submitFoo();"> </form> </body> <script src="/static/jquery-3.2.1.js"></script> <script src="/static/jquery.cookie.js"></script> <script></script> <script> function submitFoo() { var token=$('input[name=csrfmiddlewaretoken]').val(); var user=$('#user').val(); $.ajax({ url:'/csrf1.html', type:'POST', data:{'user':user,'token':token}, success:function (arg) { console.log('ok') } }) } </script> </html>
页面中获取到token :
三、CBV 方式使用CSRF
# CBV 中使用 CSRF,必须用 method_decorator from django.views import View from django.utils.decorators import method_decorator def wrapper(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner @method_decorator(wrapper,name='post') # 给post 函数 加 csrf 方式一 class Foo(View): def get(self,request): # return render(request, 'csrf1.html', {'data': 1}) pass @method_decorator(wrapper) #指定方法加 方式二 def post(self,request): # return render(request, 'csrf1.html', {'data': 1}) pass def dispatch(self, request, *args, **kwargs):# return wrapper
1】CBV 方式应用CSRF
# @method_decorator(csrf_protect,name='dispatch') #方式三 ,全部函数添加 # class Foo(View): # def get(self, request): # pass # # @method_decorator(wrapper) # def post(self, request): # pass # # def dispatch(self, request, *args, **kwargs): # return wrapper