python Django学习(14)——CSRF

前言

    之前在做form表单提交或者ajax提交的时候,都会提前在settings.py中做一个配置:找到MIDDLEWARE,把里面关于CSRF那一句注释掉,然后再做提交,那么,如果我们不注释,会出现什么情况呢?

一.CSRF原理

    我们先来把注释CSRF的那一句打开,然后运行程序,在login页面输入账号密码,然后点提交,然后就出现了下面这个页面:
在这里插入图片描述
    这个错误的意思是csrf校验失败,request请求被丢弃掉。
    那么什么是CSRF呢?
    CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的.

二.解决方法

1.form表单提交

    对于form表单提交来说,有两种方法解决CSRF错误.
方法一:
    第一种方法就是我们之前一直用的,在settings.py中找到MIDDLEWARE,将里面关于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',
]

方法二:
    第二种方法就是在form表单里加上{% csrf_token %}

        <p>{% csrf_token %}</p>
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="checkbox" name="rmb" value="1">10秒免登陆
        <input type="submit" value="提交">
2.ajax提交

    对于ajax数据的提交,通过以下方式来解决:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="/app01/login/" method="post">
        <p>{% csrf_token %}</p>
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="checkbox" name="rmb" value="1">10秒免登陆
        <input type="submit" value="提交">
        <input id="btn" type="button" value="按钮">
        <input id="btn2" type="button" value="按钮">
        <script src="/static/jquery-1.12.4.js"></script>
        <script src="/static/jquery.cookie.js"></script>
        <script>
            $(function () {
                发送ajax请求的时候的配置
                $.ajaxSetup({
                beforeSend: function(xhr,settings){
                    xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
                }
            });
                $('#btn,#btn2').click(function () {
                    $.ajax({
                        url:"/app01/login/",
                        type:"POST",
                        data:{'user':'root','pwd':'123'},
                        success:function (arg) {

                        }
                    })
                })
            })
        </script>
    </form>
</body>
</html>

    主要代码:

	{#发送ajax请求的时候的配置#}
     $.ajaxSetup({
     beforeSend: function(xhr,settings){
         xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
     }

    这样的配置就是为所有的ajax请求都配置好了.

另外,在settings.py中注释掉CSRF就以为着所有的函数都不需要认证了.假如我们有100个函数,其中98个需要认证,2个不需要认证,那么我们注释掉CSRF后,还得为另外98个单独配置;
意思也就是说,settings.py中是全局配置,那么有没有局部配置呢?

局部配置:
from django.views.decorators.csrf import csrf_exempt,csrf_protect


@csrf_protect
def index(request):
    # 获取当前用户的随机字符串
    # 根据随机字符串获取对应信息
    if request.session.get('is_login',None):
        return render(request,'index.html',{'data':request.session['username']})
    else:
        return HttpResponse('滚!')

@csrf_exempt
def index_test(request):
    pass

    其中:


@csrf_exempt
def index_test(request):
    pass

    @csrf_exempt表示index_test()这个函数不需要认证了.
    同理:@csrf_protect就表示被装饰的那个函数需要认证.

写在最后

    本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值