zoukankan      html  css  js  c++  java
  • 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中没有设置全局中间件。
     
  • 相关阅读:
    Spring Boot 2.x实战之StateMachine
    Spring Boot实战之定制type Formatters
    Spring Boot实战之定制URL匹配规则
    Spring Boot项目中如何定制servlet-filters
    Mac高效开发之iTerm2、Prezto和Solarized主题
    Spring Boot应用的健康监控
    Spring Boot构建的Web项目如何在服务端校验表单输入
    Spring Boot项目中如何定制PropertyEditors
    Spring Boot项目中如何定制拦截器
    在Spring Boot项目中使用Spock测试框架
  • 原文地址:https://www.cnblogs.com/cq146637/p/7811692.html
Copyright © 2011-2022 走看看