[TOC=1,5] >[success] # 什么是CSRF CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。可以理解别人伪造了网站偷了你的cookie,然后进行攻击 >[success] # django中如何使用 在django的setting.py文件中,有中间件插件配置变量名MIDDLEWARE,其中有一个'django.middleware.csrf.CsrfViewMiddleware',这就是django中的csrf中间插件,平常我们使用django进行post的请求时,如果不注释'django.middleware.csrf.CsrfViewMiddleware',网站就会403报错,我们如何来开启这个中间件,并解决相应问题 >[danger] ##### csrf 配置 ~~~ 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: 先引用方法: from django.views.decorators.csrf import csrf_exempt,csrf_protect 装饰器: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。 @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。 ~~~ >[danger] ##### 基本使用 ~~~ <form action="/login/" method="post"> {% csrf_token %} <input name="user" type="text"> <input name="pwd" type="password"> <input type="submit"> </form> ~~~ >[danger] ##### ajax 使用 ![](https://box.kancloud.cn/8e8b4863b3fe463e406df992d95a30a1_625x105.png) 上面的图中发现,其实我们可以通过获取浏览中的csrftoken字段来验证csrf,所以只要取出对应的k,v就可以 ~~~ <form action="/login/" method="post"> {% csrf_token %} <input name="user" type="text"> <input name="pwd" type="password"> <input type="submit"> <input id="btn" type="button" value="提交按钮"> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function () { $('#btn').click(function () { $.ajax({ url:'/login/', type:'POST', data:{"user":'root',"pwd":"root"}, headers:{'X-CSRFtoken':$.cookie('csrftoken')}, success:function (arg) { alert(arg); } }) }) }) </script> ~~~ >[danger] ##### ajax 全局配置 ~~~ 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 () { $('#btn').click(function () { $.ajax({ url:'/login/', type:'POST', data:{"user":'root',"pwd":"root"}, headers:{'X-CSRFtoken':$.cookie('csrftoken')}, success:function (arg) { alert(arg); } }) }) }) </script> ··· ~~~