2014-02-27 140 views
24

我需要通過CSRFToken與基於Ajax的發佈請求,但不知道如何以最佳方式完成此操作。 使用一個平臺,它的內部檢查要求CSRFToken(POST唯一的要求)將CSRFToken添加到Ajax請求

起初我想將它添加到頭部像

$(function() { 
    $.ajaxSetup({ 
     headers : { 
      'CSRFToken' : getCSRFTokenValue() 
     } 
    }); 
}); 

這將使它可用於每個Ajax請求,但不會爲我的案件工作,因爲在請求CSRFToken仍然是空的。

有什麼辦法,我可以設置CSRFToken所有Ajax調用處理POST

編輯 如果我做這樣的事情在我的Ajax調用

data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()}, 

一切工作正常。

我的問題是,我想通過CSRFToken值作爲請求參數,而不是作爲一個請求頭

+0

因此,頭被傳遞,但令牌爲空? getCSRFTokenValue()'做了什麼? –

+0

@RobinJonsson:這只是獲取令牌的價值 –

+0

我面臨同樣的問題(需要通過基於Ajax的CSRF令牌,但只使用JS。我不熟悉JQuery :( – shahz

回答

24

這個怎麼樣,

$("body").bind("ajaxSend", function(elm, xhr, s){ 
    if (s.type == "POST") { 
     xhr.setRequestHeader('X-CSRF-Token', getCSRFTokenValue()); 
    } 
}); 

編號:http://erlend.oftedal.no/blog/?blogid=118

要傳遞CSRF作爲參數,

 $.ajax({ 
      type: "POST", 
      url: "file", 
      data: { CSRF: getCSRFTokenValue()} 
     }) 
     .done(function(msg) { 
      alert("Data: " + msg); 
     }); 
+0

謝謝,儘管值得通過,但它沒有在請求中提供,這是它從服務器端request.getParameter(CSRF_PARAM_NAME)' –

+0

'request.getParameter(CSRF)'請求在服務器端獲取請檢查我更新的答案 –

+0

謝謝!!,我知道這種方式,但在這種情況下,這意味着我需要添加這個到每個Ajax調用,我將在我的應用程序中做 –

5

您可以使用此:

var token = "SOME_TOKEN"; 

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    jqXHR.setRequestHeader('X-CSRF-Token', token); 
}); 

從技術文檔:

jQuery.ajaxPrefilter([數據類型],處理(選項,originalOptions, jqXHR))

說明:處理自定義Ajax選項或修改現有選項 ,然後再發送每個請求,並由$ .ajax()處理它們。

Read

+0

謝謝,雖然值正在通過,但它在請求中不可用,這是如何從服務器端請求中獲取'request.getParameter(CSRF_PARAM_NA ME)' –

+0

@UmeshAwasthi你使用node.js? –

+0

不,我爲此使用Jquery –

3

這裏是代碼,我使用AJAX

$(document).ready(function(){ 
    function getCookie(c_name) { 
     if(document.cookie.length > 0) { 
      c_start = document.cookie.indexOf(c_name + "="); 
      if(c_start != -1) { 
       c_start = c_start + c_name.length + 1; 
       c_end = document.cookie.indexOf(";", c_start); 
       if(c_end == -1) c_end = document.cookie.length; 
       return unescape(document.cookie.substring(c_start,c_end)); 
      } 
     } 
     return ""; 
    } 

    $(function() { 
     $.ajaxSetup({ 
      headers: { 
       "X-CSRFToken": getCookie("csrftoken") 
      } 
     }); 
    }); 

})發送POST請求時,以防止跨站請求僞造令牌問題;

+0

我使用了getCookie函數。它是有益的。謝謝 – BAE

1

這對我有用(使用jQuery 2。1)

$(document).ajaxSend(function(elm, xhr, s){ 
    if (s.type == "POST") { 
     s.data += s.data?"&":""; 
     s.data += "_token=" + $('#csrf-token').val(); 
    } 
}); 

或該:

$(document).ajaxSend(function(elm, xhr, s){ 
    if (s.type == "POST") { 
     xhr.setRequestHeader('x-csrf-token', $('#csrf-token').val()); 
    } 
}); 

(其中#CSRF令牌是包含令牌元件)

0

答案上面沒有爲我工作。

我下面的代碼添加我的AJAX請求之前:

function getCookie(name) { 
       var cookieValue = null; 
       if (document.cookie && document.cookie != '') { 
        var cookies = document.cookie.split(';'); 
        for (var i = 0; i < cookies.length; i++) { 
         var cookie = jQuery.trim(cookies[i]); 
         // Does this cookie string begin with the name we want? 
         if (cookie.substring(0, name.length + 1) == (name + '=')) { 
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
          break; 
         } 
        } 
       } 
       return cookieValue; 
      } 
      var csrftoken = getCookie('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); 
        } 
       } 
      }); 

      $.ajax({ 
        type: 'POST', 
        url: '/url/', 
      }); 
0

我在帖子在博客列表這個問題,後是在foreach內部的視圖,那麼很難在選擇它JavaScript,並且post方法和令牌的問題也存在。

這是javascript的代碼在視圖結束時,我在視圖內部生成了javascript函數中的令牌,而不是在外部js文件中,然後很容易使用php lavarel使用csrf_token()函數生成它,並且直接在params中發送「delete」方法。 你可以看到我不使用var路由:{{route('post.destroy',$ post-> id}},因爲我不知道我想刪除的id,直到有人點擊銷燬按鈕,if你沒有必要這個問題,你可以使用{{路線(「post.destroy」,$後> ID}}或其他這樣的。

$(function(){ 
    $(".destroy").on("click", function(){ 
     var vid = $(this).attr("id"); 
     var v_token = "{{csrf_token()}}"; 
     var params = {_method: 'DELETE', _token: v_token}; 
     var route = "http://imagica.app/posts/" + vid + ""; 
    $.ajax({ 
     type: "POST", 
     url: route, 
     data: params 
    }); 
    }); 
    }); 

和這個鑑於內容代碼(裏面的foreach還有更多的形式和每個崗位的數據,但它不是這個例子inportant),你可以看到我添加一個類「刪除」按鈕,然後我叫類的JavaScript。

 @foreach($posts as $post) 
      <form method="POST"> 
      <button id="{{$post->id}}" class="btn btn-danger btn-sm pull-right destroy" type="button" >eliminar</button> 
      </form> 
     @endforeach 
2

如果你在工作lusca的node.js也試試這個:

$.ajax({ 
url: "http://test.com", 
type:"post" 
headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')} 
})