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

 

posted @ 2017-06-28 16:32  tonycloud  阅读(160)  评论(0)    收藏  举报