• Django学习-17-CSRF


    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中没有设置全局中间件。
     
  • 相关阅读:
    C# 模拟串口发送接收
    maven update解决TypeMismatchException
    [转载]JUnit3 与 JUnit4 的区别
    JUnit版本导致eclipse的build path加入的Maven Dependencies没起作用
    [转载][oracle]使用exp导出数据的日志中报warning如EXP-00091 Exporting questionable statistics
    [框架][MyBatis]MyBatis集锦
    [转载][工具]Secure CRT 自动记录日志和时间戳功能配置的方法
    jUnit Test遇到org.apache.ibatis.binding.BindingException
    [转载[工具]]PLSQL使用技巧
    [转载][工具]Eclipse Console 加大显示的行数,禁止弹出
  • 原文地址:https://www.cnblogs.com/cq146637/p/7811692.html
Copyright © 2020-2023  润新知