Django学习-17-CSRF

时间:2022-08-10 17:04:24
CSRF(跨站请求伪造)
        用户请求获取数据时,加入一段加密字符串,只有服务器能反解。
        XSS(跨站脚本攻击),JS脚本在网站中运行,如果获取到用户Cookie,可以利用Cookie实现登录。
        CSRF验证使用户提交数据时,如果不带上加密字符串不允许登录。
        所以发送给客户端的页面中要加上CSRFtoken,这样,下次客户端再次请求时就会有加密后的随机字符串
  
        settings.py中间件CSRF
        'django.middleware.csrf.CsrfViewMiddleware'
    开启这个功能,默认Django的所有post请求如果不带上csrftoken不允许请求页面
 
 
        1.一般不这么发,会放在请求头中发送
        <form action>        
            {%csrf_token%}
        </form>
        2.Ajex请求带上CSRF
        一般来说如果在请求头中添加数据key-mysql,那么Django会在最终的请求头的把key改变为HTTP_KEY(下划线非法)
        我们的CSRF也默认在请求头中传递,键名为HTTP_X_CSRFTOKEN  -----> X-CSRFtoken
        这样传递就会通过CSRF的验证中间件
         ①$('#i1').click(function(){
                var csrf_token = $.cookie('csrf_token')
                $.ajax({
                    url:'xxx',
                    type:'post',
                    data:{ 'username':xxx,'password':123123 }
                    headers:{ 'x-CSRFtoken':csrf_token }
                    success:function(arg){
                        
                    }
                })
         })
        ②Ajax整个页面统一配置
         xhr 是 XMLHttpRequest对象,默认Ajax底层使用的就是它
         var csrftoken = $.cookie('csrftoken');
         function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
    
      大多数请求需要CSRF验证
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.csrf import csrf_protect
            @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。            
      少数请求需要CSRF验证
            @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。