CSRF跨站請求僞造

1、簡介jquery

django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。ajax

全局:django

         中間件 django.middleware.csrf.CsrfViewMiddlewarecookie

局部:session

 from django.views.decorators.csrf import csrf_exempt,csrf_protect
  • @csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
  • @csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。

2、應用函數

普通表單提交post

 

<form action="/xiaoqing/session1/" method="post">
    {{ csrf_token }}   #實際上是後臺給用戶發 一堆字符串
    {% csrf_token %}  #須要設置 {% csrf_token %}
    <input type="text" name="username"/>
    <input type="text" name="password"/>
    <input type="checkbox" value="1" name="remember">10s免登陸
    <input type="submit" value="提交"/>
    <input type="button" value="ajax提交" id="btn">
</form>

 

 

Ajax提交ui

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

<form action="/xiaoqing/session1/" method="post">
    {{ csrf_token }}   #實際上是後臺給用戶發 一堆字符串
    {% csrf_token %}
    <input type="text" name="username"/>
    <input type="text" name="password"/>
    <input type="checkbox" value="1" name="remember">10s免登陸
    <input type="submit" value="提交"/>
    <input type="button" value="ajax提交" id="btn">
</form>
<script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>

    var csrftoken = $.cookie('csrftoken')   #獲取csrftoken  cookie
      
    
    $(function(){
     

     
       function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); #判斷是get方法仍是post方法 }
$.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); //這段表示判斷是get請求仍是post請求 get請求不須要csrftoken驗證
        $.ajaxSetup({

            beforeSend:function(xhr,settings){
                xhr.setRequestHeader('X-CSRFtoken',csrftoken)

            }

        })

    $('#btn').click(function(){

            $.ajax({

                url:'/xiaoqing/session1/',
                type:'POST',
                data:{'user':"root",'pwd':123456},
{#                headers:{'X-CSRFtoken':csrftoken#}
                success:function(arg){

                }

            })

    })

    })

</script>
相關文章
相關標籤/搜索