2017-01-29 55 views
1

csrfトークンが与えられていないため、私のajax urlが500を返すので、csrfトークン(私はLaravelを使用しています)をajaxリクエストで渡す方法を学びたいと思っています。LarvelでAjaxリクエストを送信

get要求を使用するのは安全ですか?人々は外部サイトからの要求を偽装できますか?私はちょうどセキュリティホールなしでこれを行うための最善の方法を探しています。ここ

は私のAjaxコードである:私のルートで

<script>$.ajaxSetup({ headers: { 'csrftoken' : '{{ csrf_token() }}' } });</script> 

:私のAjaxのコントローラで

Route::group(['middleware' => 'ajax', 'prefix' => 'ajax'], function() { 
      Route::any('/save-notes', '[email protected]'); 
     }); 

<?php 

namespace App\Http\Controllers\Admin\Admin; 

use Illuminate\Http\Request; 
use Cache; 
use Auth; 
use App\Database\Website\User\Roleplay; 

class AjaxController 
{ 
    public function saveNotes() 
    { 
     if (!Auth::guest()) { 
      $roleplay = Roleplay::where('user_id', Auth::user()->id)->first(); 
      $roleplay->housekeeping_notes = 'We saved it:) ' . rand(10,40); 
      $roleplay->save(); 
     } 
    } 
} 
私のブレードファイルで

saveHousekeepingNotes(); 

function saveHousekeepingNotes() { 
    $.ajax({ 
     url: "/ajax/save-notes", 
     type: "POST", 
     data: 'Here we have some data.', 
     beforeSend: function(xhr) { 
      $('.notes-status-holder').html('Saving...'); 
     }, 
     success: function(data) { 
      var jqObj = jQuery(data); 
      var d = new Date(); 
      $('.notes-status-holder').html('autosaved ' + d.toLocaleTimeString()); 

      setInterval(function() { 
       saveHousekeepingNotes(); 
      }, 5 * 1000); 
     }, 
    }); 
} 

私のajaxミドルウェアは$ request-> ajax()がajax呼び出しを確認するかどうかをチェックします。だから私は基本的に尋ねるのは、どのようにしてcsrfトークンを安全に渡すことができるかということです。ララヴェルはそれを処理しますか?またはこれを行う良い方法はあります..です

+0

[larvel TokenMismatchException of ajax request]の重複可能性があります。(http://stackoverflow.com/questions/21627170/laravel-tokenmismatchexception-in-ajax-request) – teynon

答えて

2

だけでなく、あなたがより良いそうのように、メタタグであなたのCSRFトークンを保存Laravel Docsに従って:あなたのメインのJavaScriptファイルはこのヘッダを含めるの内側その後

<meta name="csrf-token" content="{{ csrf_token() }}"> 

すべての要求(指定したヘッダ名が間違っていたことに注意してください)で:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

そして、それが動作するはずです:)

+0

@Advaithの代わりにこれを使用する理由answer 、私はそれがドキュメントにあるが、なぜそれを満たして保存するタグ? –

+0

この方法はよりクリーンで移植性が高いです** 'js'と' blade'を混在させる必要がないので、 'header'にCSRFを指定することはlaravelのネイティブな方法であり、ほとんどの標準ですcsrfのヘッダとして 'X-XSRF-TOKEN'を使うための言語です。 のサンプル [spring](https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html) –

1

をただ、これを使用します。

_token: '{{ csrf_token() }}' 

これは、ajaxリクエストでもフィールドの名前が送信されているためです。
通常、csrf_fieldを作成した場合、名前は_tokenであり、ここでそれを使用するだけです。

$.ajax({ 
    url: "/ajax/save-notes", 
    type: "POST", 
    data: { 
     _token: '{{ csrf_token() }}', 
     // rest data here 
    }, 
    beforeSend: function(xhr) { 
     $('.notes-status-holder').html('Saving...'); 
    }, 
    success: function(data) { 
     var jqObj = jQuery(data); 
     var d = new Date(); 
     $('.notes-status-holder').html('autosaved ' + d.toLocaleTimeString()); 

     setInterval(function() { 
      saveHousekeepingNotes(); 
     }, 5 * 1000); 
    }, 
}); 
0

あなたはCSRFあなたが現在行っている方法を渡したい場合は、あなたのスクリプトにこのヘッダを渡すためにhtaccessファイルを伝え、またそれが名前

<IfModule mod_rewrite.c> 
<IfModule mod_negotiation.c> 
    Options -MultiViews 
</IfModule> 

RewriteEngine On 

# Handle Front Controller... 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 


# Handle custom csrf Header 
    RewriteCond %{HTTP:csrftoken} . 
    RewriteRule .* - [E=X-XSRF-TOKEN:%{HTTP:csrftoken}] 
</IfModule> 

入れが@Afik​​Deriソリューションであることを覚えているのです変更する必要がありますもっとportable.and cleaner

関連する問題