CSRF相关
CSRF原理
第一次获取页面的时候浏览器返回一个随机字符串,之后提交数据的时候需要把到这个字符串去提交,不然会报错
返回的时候还会把这个字符串放到cookie里面,
使用form提交时候:
{% csrf_token %}
b. 无CSRF时存在隐患
用户可以从其他网站提交表单到当前网站
c. Form提交(CSRF)
<form action="/login/" method="POST"> {% csrf_token %} {{ csrf_token }} <div><input type="text" name="username" placeholder="用户名"/> </div> <div><input type="password" name="pwd" placeholder="请输入密码"/> </div> <div><input type="checkbox" name="check" value="1"/> 一周之内免登陆</div> <div><input type="submit" value="提交"/> </div> <div><input id="btn1" type="button" value="提交1"/> </div> </form>
d. Ajax提交(CSRF)
1 <script src="/static/jquery.js"></script> 2 <script src="/static/jquery.cookie.js"></script> 3 <script> 4 $(function(){ 5 $.ajaxSetup({ 6 beforeSend: function(xhr,settings){ 7 xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')); 8 } 9 }); 10 11 $('#btn1').click(function () { 12 console.log($.cookie('csrftoken')); 13 $.ajax({ 14 url: '/login/', 15 type:"GET", 16 data: {'user': 'root', 'pwd': '123'}, 17 // headers: {'X-CSRFtoken': $.cookie('csrftoken')}, 18 success:function(arg){ 19 20 } 21 }) 22 }); 23 }) 24 </script>
CSRF请求头 X-CSRFToken
e.个别页面需要csrf验证的解决方法
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
ajax在setup里面加
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
完整代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div style="width: 300px; margin: 100px auto;background-color: dodgerblue"> <form action="/login/" method="POST"> {% csrf_token %} {{ csrf_token }} <div><input type="text" name="username" placeholder="用户名"/> </div> <div><input type="password" name="pwd" placeholder="请输入密码"/> </div> <div><input type="checkbox" name="check" value="1"/> 一周之内免登陆</div> <div><input type="submit" value="提交"/> </div> <div><input id="btn1" type="button" value="提交1"/> </div> </form> </div> <script src="/static/jquery.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 () { console.log($.cookie('csrftoken')); $.ajax({ url: '/login/', type:"GET", data: {'user': 'root', 'pwd': '123'}, // headers: {'X-CSRFtoken': $.cookie('csrftoken')}, success:function(arg){ } }) }); }) </script> </body> </html>