XSS攻击&CSRF攻击 ----Django解决方案


XSS攻击:

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

比如获取用户的cookie。

Django已经默认做了处理,自动防御xss攻击。

但是有时候需要通过传输HTML代码并且让其显示在页面上的时候怎么做:

在需要的时候添加 xxx|safe   需要注意以下几点:

1.不能在别人能修改的地方添加

2.添加的时候要带上特殊字符的过滤

 

CSRF攻击(跨站请求伪造):

用户U登录了一家银行B,然后同时用点进去一个带颜色的网站,网站有些特殊的图片(隐藏着href请求银行B转账的标签)

用户U点击后,因为之前已经成功登录到银行B,拿到其对应的cookie, 这个隐藏的href请求就被银行识别为用户U的操作

带颜色网站通过伪造转账请求,成功收到用户在毫不知情下的转账。

应对方法:

1.银行在收到第一次get请求的时候,返回一串随机字符串,后续的操作用户需要带着这个随机字符串来(CSRF),请求才有效。

而且这个随机字符串只会在银行的页面有。带颜色网站因为没有这个随机字符串,请求无效403。(除非破解其随机字符串算法)

2.短信验证

3.令牌

Django自动开启CSRF防御

settings-MIDDLEWARE- django.middleware.csrf.CsrfViewMiddleware', 

FBV

#--------全局禁用
#'django.middleware.csrf.CsrfViewMiddleware'
直接把这的东西注释掉就行


#---------局部禁用
'django.middleware.csrf.CsrfViewMiddleware'
from django.views.decorators.csrf import csrf_exempt
在对应函数上加上装饰器
@csrf_exempt
def default(request):
    pass


#---------局部使用
#'django.middleware.csrf.CsrfViewMiddleware'
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def default(request):
    pass

CBV

 1 from django.utils.decorators import method_decorator
 2 @method_decorator(csrf_protect)
 3 加到类上面,对整个类起作用
 4 加到类里面某个方法上面,对这个方法起作用
 5 @method_decorator(csrf_protect,name='get')#对类里面的get方法加装饰器
 6 @method_decorator(csrf_protect,name='post')#可以在类上这样叠加着写,给多个方法加
 7 给dispatch加相当于给所有方法都加上
 8 
 9 ps:
10 dispatch作用:
11 
12 dispatch方法接受请求并最终返回响应。通常,它通过调用另一个方法(如get)来返回响应。把它看作是请求和响应之间的中间人。
13 
14 
15 from django.shortcuts import HttpResponse,render,redirect
16 
17 from django.views import View
18 
19 class Login(View):
20 
21     def dispatch(self, request, *args, **kwargs):
22         print('before')     #  类似装饰器  先执行before   再执行after  中间的就是下面方法执行结果
23         obj=super(Login,self).dispatch(request, *args, **kwargs)
24         print('after')
25         return obj
26 
27     def get(self,request):
28         return render(request, 'login1.html')
29 
30     def post(self,request):
31         print(request.POST.get('title'))
32         return  HttpResponse('ok')
33 
34 #title=‘牛牛’
35 
36 
37 #执行结果:
38 before
39 after
40 before
41 牛牛
42 after

此时提交数据的话就需要在form表单和Ajax中带上添加上对应的东西

在form表单中加上{% csrf_token %}

   
{% csrf_token %}

用户:

密码:

{{message}}


不仅会在form内部加上字符串,在你的cookie里面也会加上csrftoken

Ajax请求的时候放入data中:

从源码看form表单内csrf_token的值:
     "hidden" name="csrfmiddlewaretoken" value="d11IbXhGli1qRbN3QogQhdWeXHBMnwCJzbtQyCfef0YecNLuCIhHTFzh25FYnkX7">

var csrf=$('input[name="csrfmiddlewaretoken"]').val();
var user=$('#id').val();

           $.ajax(
             {
                url:'/form_login_ajax/',
                type:'POST',
                data:{'csrfmiddlewaretoken':csrf,'use'=user}
             })

data里面的key要与后台获取值的key一一对应

#也可以把CFRF的值这样放入data
data:{'csrfmiddlewaretoken':'{{csrf_token}}','use'=user}

Ajax请求的时候获取cookie中的csrftoken,放入请求头headers中

通过js获取cookie的值
在F12-Console 里面:document.cookie 可以看到CFRS随机字符串(键值)


插件:jquery.cookie.js(依赖于jquery)  可以cookie操作
$.cookie('csrftoken')直接拿到CFRF随机字符串
$.cookie('qwer','asdf') ,在本地cookie里面再增加一个键值对


var token=$.cookie('csrftoken')  #得放到请求头里面
    $.ajax(
             {
                url:'/form_login_ajax/',
                type:'POST',
                headers:{'X-CSRFToken':token},
                data:{'user':user},
              })

X-CSRFToken是Django设定死的,就得这样写