首页 > 代码库 > Django信息安全相关之CSRF和XSS

Django信息安全相关之CSRF和XSS

什么是xss攻击

xss攻击:

黑客把恶意的JS脚本提交到后端,后端把恶意脚本渲染显示出来    

什么是CSRF?

1、你登录建行官网后 你的浏览器就保存了建行网站的cokie,(如果不关闭这个页面cookie一直生效,就可以发送任何请求)专门在cappron试了一下;

2、与此同时你 点了其他恶意页面(CSRF攻击的条件)

3、这个页面携带着你的cokie 伪造你 向到招商银行提交 一个转账form表单你就傻逼了!

(问题关键:登录某网站之后有了cokie,就可以发送任何请求;这时候最危险)


如何防止CSRF攻击

服务端端开启 csrf认证之后,

客户端发送get请求 要form表单时,在里面加上{% csrf_token %}一个随机字符串

客户端收到这个 带随机字符串的 form表单之后

客户端在向服务端 发post请求(不仅要有cokie还检查这个from表单是不是携带{% csrf_token %})
(不要以为有了cokie就可以随意发送 post请求了!)


说白了就是:服务端生成随机字符串发给客户端,下次客户端来了要检查他的这个随机字符串;


{% csrf_token %}{#
<QueryDict: {‘csrfmiddlewaretoken‘: [‘Vk4rQ7L3d2stscFgHq7lKWTWSEcZrIRAAw3QJv6G2FLopBVJb7sONVbiP9aqDjgj‘], ‘user‘: [‘我‘], ‘pwd‘: [‘q‘], ‘gender‘: [‘1‘], ‘login‘: [‘yes‘]}>

 

Django应用CSRF

1.服务端全部禁用CSRF验证

在项目的setings文件把这个 中间件注释掉

‘django.middleware.csrf.CsrfViewMiddleware‘,

 

2、局部使用

免除FBV的 CRFS验证

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt(免除)
def login(request):
    if request.method==GET:
        return render(request,login.html)
    else:
        print(request.POST)
        return HttpResponse(OK)

要求FBV使用CRFS验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect

@csrf_protect(保护)
def login(request):
    if request.method==GET:
        return render(request,login.html)
    else:
        print(request.POST)
        return HttpResponse(OK)

 

3、CBV应用CSRF验证

要想在CBC局部使用或者禁用CRF验证就必须 导入method_decorator(方法装饰)

from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name=dispatch)
class login(View):
    def get(self,request):
        return render(request,login.html)

    def post(self,request):
        return HttpResponse("ok")

 

4、from表单添加CSRFtocken

 

{% csrf_token %}

 

 

 

Ajax应用CSRF

如果服务端开启了CSRF验证,客户端就发送post请求就必须携带 服务端给的CSRF
那问题来了如果发 ajanx请求呢?

答案:客户端发送 get请求时,服务端会把CSRF tocken放在form表单中(隐藏的input标签)发送给客户端

如果客户端再发post请求给服务端找到这个标签,name="csrfmiddlewaretoken"发送给服务端

<script src="/static/zhanggen.js"></script>
</head>
<body>
<h1>欢迎来到百合网</h1>
<form>
    
{#        服务端开启csrf认证#}
    <p>用户:<input type="text" name="user" ></p>
    <p>密码:<input type="password" name="pwd"></p>
    <p>
        性别:男:<input type="radio" name="gender" value="1" b="1">
              女:<input type="radio" name="gender" value="2">
    </p>
    <p><input type="checkbox" name="login" value="yes" zhanggen="1">一周免登录</p>
    <input type="button" value="提交" onclick="a()">
</form>
</body>
<script>
    function a(){
        tocken=$([name="csrfmiddlewaretoken"]).val()
        $.ajax({
            url:/login/,
            type:POST,
            data:{csrfmiddlewaretoken:tocken},
        或者这样data:{csrfmiddlewaretoken:{{csrf_token}}},最后福建小伙向淫王一问
        })
    }
</script>
</html>

 

2、如果没有from表单携带CSRF的话,不要忘了CSRF的随机字符串也会放在cookie里面哦!!


导入<script src="http://www.mamicode.com/static/jquery.cookie.js"></script>

如果是在cookie里面 获取的 CSRF tocken(记号)就不能放在 ajax的请求体里面了

放在请求头里,而且必须以这个格式(headers:{‘X-CSRFToken‘:tocken},) 这是Django规定

 

 

注意cookie里的 CSRF tocken和 from表单里的不一样

 function a() {
     var tocken=$.cookie(‘csrftoken‘)
     $.ajax({
            url:‘/login/‘,
            type:‘POST‘,
            headers:{‘X-CSRFToken‘:tocken},
            data:{‘name‘:‘aa‘},
        })
    }

</script>
</html>

 

Django信息安全相关之CSRF和XSS