前言
之前在做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就表示被装饰的那个函数需要认证.
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.