首页 > 其他 > 详细

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

时间:2021-06-15 16:13:59      阅读:25      评论:0      收藏:0      [点我收藏+]

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
View Code

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
View Code

 

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

 

 

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

   <form  method="POST" action="/xx/">
            {% csrf_token %}
            <p>用户:<input id="" type="text" name="username"/></p>
            <p>密码:<input type="password" name="password"/></p>
            <p><input type="submit" name="提交">{{message}}</p>
   </form>
不仅会在form内部加上字符串,在你的cookie里面也会加上csrftoken

Ajax请求的时候放入data中:

技术分享图片
从源码看form表单内csrf_token的值:
     <input type="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}
View Code

 

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设定死的,就得这样写

 

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

原文:https://www.cnblogs.com/liujinmeng/p/14884617.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!