django进阶(九)之csrf设置
csrf基础设置
settings.py
中间件设置:之前由于配置post登陆的时候报403错误,把图中画红框的部分注释掉才能使用,这次将其注释去掉,并配置能访问

csrf原理:
客户端在提交get请求数据的时候,服务端不进会给客户端数据,还会给客户端一个字符串(加密的,只有服务端能反解),客户端提交数据的时候只有带着这个字符串一起提交,服务端才允许提交,否则不允许提交,相当于多了一层保护
去掉注释后的前端配置()

添加csrf_token,然后将这个随机的字符串在提交数据的时候一起提交给服务端
添加完后提交一次,发现cookies中有这个csrf_token,提交数据时我们需要将这个token返回给服务端

通过ajax请求去实现token和数据的提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/common.css"> <style> label{ width: 100px; display: inline-block; text-align: center; } </style> </head> <body> <form action="/cmdb/login/" method="post" enctype="multipart/form-data"> {% csrf_token %} <p> <label for="username">用户名:</label> <input id="username" name="user" type="text"/> </p> <p> <label for="password">密码:</label> <input id="password" name="password" type="password"/> </p> <p> <input type="checkbox" name="rmb" value="1">10秒免登陆 </p> <p> <input id="tj" type="submit" value="提交"/> <span style="color: red">{{ error_msg }}</span> </p> </form> <script src="/static/jquery-3.2.1.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function () { $.ajaxSetup({ //xhr --> xmlhttprequest对象 beforeSend:function (xhr,settings) { xhr.setRequestHeader('X-CSRFtocken',$.cookie('csrftoken')) } }); $('#tj').click(function () { $.ajax({ url:'/cmdb/login', type:"POST", data:{'username':'root','password':'123456'}, // headers:{'X-CSRFtocken':$.cookie('csrftoken')}, //由于所有的post请求都要加headers,会很麻烦,所以用最上面的 success:function (obj) { } }) }) }) </script> </body> </html>

通过中间件设置csrf
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
- 中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

示例


另一种方法:在模版语言里(html)设置
<script src="/static/plugin/jquery/jquery-1.8.0.js"></script> <script src="/static/plugin/jquery/jquery.cookie.js"></script> <script type="text/javascript"> var csrftoken = $.cookie('csrftoken'); 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>


浙公网安备 33010602011771号