Django框架学习笔记(22.CSRF原理简单介绍)

来源:互联网 发布:淘宝采集软件收费吗 编辑:程序博客网 时间:2024/06/05 06:33

前面我们写Django的时候,都要在settings.py里把CSRF注释掉,这里其实是Django提供的一层防护,防止提交的数据含有XSS攻击,只有请求里面含有CSRF令牌(随机字符串)才可以通过,否则会被禁止。这里不注释掉也可以写:

<form action="/login/" method="POST">    {% csrf_token %}    <input type="text" name="user"/>    <input type="password" name="pwd"/>    <input type="checkbox" name="rmb" value="1"/>一天内免登录    <input type="submit" value="登录"/></form>


ajax方式(提前配置ajax):

<body><form action="/login/" method="POST">    {% csrf_token %}    <input type="text" name="user"/>    <input type="password" name="pwd"/>    <input type="checkbox" name="rmb" value="1"/>一天内免登录    <input type="submit" value="登录"/>    <input id="btn1" type="button" value="按钮"/>    <input id="btn2" type="button" value="按钮"/></form><script src="/static/jquery-1.12.4.js"></script><script src="/static/jquery.cookie.js"></script><script>    $(function(){        $.ajaxSetup({            beforeSend:function(xhr,settings){                xhr.setRequestHeader('X-CSRFtoken',$.cookie('csrftoken'))            }        });        $('#btn1').click(function () {            $.ajax({                url: '/login/',                type: 'POST',                data: {'user': 'root', 'pwd': '123'},                success:function(arg){                }            })        });        $('#btn2').click(function () {            $.ajax({                url: '/login/',                type: 'POST',                data: {'user': 'root', 'pwd': '123'},                success:function(arg){                }            })        })    })</script></body>


views.py里面也可以设置是否使用CSRF:


当全局设置了CSRF时候,这样可以取消:

from django.views.decorators.csrf import csrf_exempt, csrf_protect@csrf_exemptdef index(request):    if request.session.get('is_login', None):        return render(request, 'index.html', {'username': request.session['username']})    else:        return HttpResponse('错误')

当全局没有设置CSRF时候,这样可以添加:

from django.views.decorators.csrf import csrf_exempt, csrf_protect@csrf_protectdef index(request):    if request.session.get('is_login', None):        return render(request, 'index.html', {'username': request.session['username']})    else:        return HttpResponse('错误')