1. 程式人生 > >python之路--web--2--Django-6-跨站請求偽造

python之路--web--2--Django-6-跨站請求偽造

跨站 orm 使用 ade safe spa doctype n) java

三、 跨站請求偽造

一、簡介

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

二、應用

1、普通表單

1 veiw中設置返回值:
2   return render_to_response(‘Account/Login.html‘,data,context_instance=RequestContext(request))  
3      或者
4      return render(request, ‘xxx.html‘, data)
5   
6 html中設置Token:
7   {% csrf_token %}

2、Ajax

對於傳統的form,可以通過表單的方式將token再次發送到服務端,而對於ajax的話,使用如下方式。

view.py

 1 from django.template.context import RequestContext
 2 # Create your views here.
 3   
 4   
 5 def test(request):
 6   
 7     if request.method == ‘POST‘:
 8         print request.POST
 9         return HttpResponse(‘ok‘)
10     return  render_to_response(‘app01/test.html‘,context_instance=RequestContext(request))

text.html

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     {% csrf_token %}
 9   
10     <input type="button" onclick="Do();"  value="Do it"/>
11   
12     <script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
13     <script src="/static/plugin/jquery/jquery.cookie.js"></script>
14     <script type="text/javascript">
15         var csrftoken = $.cookie(‘csrftoken‘);
16   
17         function csrfSafeMethod(method) {
18             // these HTTP methods do not require CSRF protection
19             return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
20         }
21         $.ajaxSetup({
22             beforeSend: function(xhr, settings) {
23                 if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
24                     xhr.setRequestHeader("X-CSRFToken", csrftoken);
25                 }
26             }
27         });
28         function Do(){
29   
30             $.ajax({
31                 url:"/app01/test/",
32                 data:{id:1},
33                 type:‘POST‘,
34                 success:function(data){
35                     console.log(data);
36                 }
37             });
38   
39         }
40     </script>
41 </body>
42 </html>

更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

python之路--web--2--Django-6-跨站請求偽造