首页 > 其他 > 详细

Django中CSRF原理

时间:2021-06-04 00:01:01      阅读:30      评论:0      收藏:0      [点我收藏+]
不要注释掉Csrf
MIDDLEWARE = [ django.middleware.security.SecurityMiddleware, django.contrib.sessions.middleware.SessionMiddleware, django.middleware.common.CommonMiddleware, django.middleware.csrf.CsrfViewMiddleware, django.contrib.auth.middleware.AuthenticationMiddleware, django.contrib.messages.middleware.MessageMiddleware, django.middleware.clickjacking.XFrameOptionsMiddleware, ]

 

前端开始提交时候,就会有个校验Csrf校验

通过form表单提交

    <form action="/login/" method="post">

          {% csrf_token %}
      #HTML会生成一个input元素参与到form表单提交中
<input type="text" name="user"> <input type="text" name="password"> <input type="checkbox" name="rmb" value="1">10秒免登录 <input type="submit" value="提交"> <input id=btn type="button" value="按钮"> </form>

通过AJAX提交

 

<script>

        {##配置默认在触发AJAX请求加上headers#}
        $(function () {
           $.ajaxSetup({
               {#xhr 所有的ajax底层操作都是XMLHttpRequest#}
               beforeSend:function (xhr,settings) {
                   xhr.setRequestHeader(X-CSRFtoken, $.cookie(csrftoken));
               }
           })
        });



        $(function () {
            $(#btn).click(function () {
                $.ajax({
                    url:"/login/",
                    type:"POST",
                    {#headers:{‘X-CSRFtoken‘:$.cookie(‘csrftoken‘)},#}
                    data:{"user":"root","pwd":"121"},
                    success:function (arg) {
                        console.log(arg);
                    }

                })
            })
        })
    </script>

 

setting中配置django.middleware.csrf.CsrfViewMiddleware是全局变量

当views中可以指定一个模块要进行Csrf,可以在方法上加上装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
示例:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect
def test():
  print(‘1234‘)


 

前端通过Ajax请求方式判断是否需要进行跨站请求

   <script type="text/javascript">
        var csrftoken = $.cookie(‘csrftoken‘);{#获取csrf#}
  
        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);
                }
            }
        });
        function Do(){
  
            $.ajax({
                url:"/app01/test/",
                data:{id:1},
                type:‘POST‘,
                success:function(data){
                    console.log(data);
                }
            });
  
        }
    </script>

 

Django中CSRF原理

原文:https://www.cnblogs.com/anhao-world/p/14845994.html

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