2017-01-29 3 views
1

Ich versuche zu lernen, wie ich ein csrf-Token (ich benutze Laravel) mit einer Ajax-Anfrage übergeben kann, da meine Ajax-URL 500 zurückgibt, weil ihr das csrf-Token nicht gegeben wurde.Senden von Ajax-Anfragen mit Laravel

Ist die Verwendung einer get-Anfrage weniger sicher? können Leute die Anfragen von einer externen Seite spoofen? Ich bin nur auf der Suche nach dem besten Weg, dies ohne Sicherheitslücken wirklich zu tun.

Hier ist mein Ajax-Code:

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); 
     }, 
    }); 
} 

In meiner Blade-Datei:

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

In meinen Routen:

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

In meinem Ajax-Controller:

<?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(); 
     } 
    } 
} 

Meine Ajax-Middleware prüft nur, ob $ request-> ajax() einen Ajax-Aufruf verifiziert. Was ich im Grunde frage ist, wie kann ich den csrf-Token sicher übergeben? Geht Laravel damit um? oder gibt es einen besseren Weg, dies zu tun ..

+0

Mögliches Duplikat [Laravel TokenMismatchException in ajax-Request] (http://stackoverflow.com/questions/21627170/laravel-tokenmismatchexception-in-ajax-request) – teynon

Antwort

2

gut, nach Laravel Docs Sie besser speichern Sie Ihre csrf Token in einem Meta-Tag, etwa so:

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

Dann in Ihrer Haupt-Javascript-Datei um diesen Header bei jeder Anfrage (bitte beachten Sie, dass der Header-Name Sie war falsch gestellt):

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

Dann sollte es funktionieren :)

+0

Warum dies statt @Advaith Antwort verwenden Ich sehe, es ist in der Dokumentation, aber warum speichern Sie es in einem Met eine Markierung? –

+0

dieser Weg ist sauberer und mehr ** portable ** wie Sie nicht hässliche Mischung 'js' und' Klinge' haben, auch CSRF in der 'header' ist eine native Art zu Laravel und es ist ein Standard in den meisten Sprachen, die 'X-XSRF-TOKEN' als Header für csrf verwenden sollen. Beispiel in [Frühling] (https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html) –

1

Nur diese verwenden.

_token: '{{ csrf_token() }}' 

Es ist, weil ajax Anfrage auch den Namen des Feldes sendet.
Normalerweise, wenn Sie ein csrf_field erstellen, können Sie es mit einem Namen _token finden, verwenden Sie das hier.

$.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

Wenn Sie die csrf den Weg passieren wollen Sie gerade tun Sie .htaccess zu sagen haben diesen Header an das Skript übergeben und es auch der Name ändern

<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> 

Put erinnern @AfikDeri Lösung mehr portable.and Reiniger

Verwandte Themen