2015-07-15 7 views
6

Im Moment bin ich learing Laravel aber ich bekomme immer die Ausnahme:Laravel TokenMismatchException

TokenMismatchException in VerifyCsrfToken.php Linie 53:

Ich versuche, ein Objekt einer Migration zu machen und dann schreibe es in die Datenbank, aber aus irgendeinem Grund funktioniert es nicht. Das ist mein route.php:

Route::get('/post/new',array(
'uses'=> '[email protected]', 
'as' => 'newPost' 
    )); 
Route::post('/post/new', array (
'uses' => '[email protected]', 
'as' => 'createPost' 
    )); 

Dies ist mein Controller genannt blog.php:

Verwendung Illuminate \ Http \ anfordern;

use App\Http\Requests; 
use View; 
use App\Http\Controllers\Controller; 
use App\posts; 

    class blog extends Controller 
    { 
     public function newPost() 
     { 
      return View::make('new'); 
     } 

     public function createPost() 
     { 
      $posts = new posts(); 
      $posts->title = Input::get('title'); 
      $posts->content = nl2br(Input::get('content')); 
      $posts->save(); 
     } 
    } 

Dies ist die Migration:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreatePostsTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('posts',function($table) { 
      $table->increments('id'); 
      $table->string('title'); 
      $table->text('content'); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     schema::drop('posts'); 
    } 
} 

Und das ist meine Hauptansicht:

@extends('master') 
@section('content') 
<h3>Add a blog post</h2> 
<form action="{{ URL::route('createPost') }}" method="post"> 
<div class="form-group"> 
<input name="title" class="form-control" type="text" placeholder="title"/> 
</div> 
<div class="form-group"> 
<textarea name="content" class="form-control" placeholder="write here"> </textarea> 
</div> 
<input type="submit" class="btn btn-primary" /> 
</form> 
@stop 

Was könnte falsch sein?

Antwort

3

Fügen Sie diese Zeile vor dem letzten Tag Ihrer Form:

{{ Form::token() }} 
+0

Danke für Ihre Antwort. Das klappt leider nicht. – Jamie

+1

Dies ist eine andere Option: '{!! csrf_field() !!} 'Probieren Sie es aus, wie @JaviStolz vorgeschlagen hat. – Michel

+0

danke, das funktioniert! Jetzt sagt es mir: Klasse 'App \ Http \ Controller \ Input' nicht gefunden – Jamie

4

dieses Recht hinzufügen, bevor </form>

{!! csrf_field() !!} 

Werfen Sie einen Blick auf Laravel docs für weitere Informationen

+0

Danke, das funktioniert. – Jamie

+0

Freut mich zu hören. Sie sollten die Frage als beantwortet markieren, um Menschen mit dem gleichen Problem zu helfen. –

+0

Schon getan. – Jamie

2

Angriffe verhindern auf Ihre Laravel-Anwendung Laravel fügt Ihrem Formular ein CSR-Token hinzu, das überprüft wird, wenn das Formular auf der Serverseite als Sicherheitsoption übergeben wird u bekommen diese Fehler bedeutet, dass Ihr Formular enthalten CSR nicht Token so Token in dem Formular enthalten können Sie {{ crsf_token() }} //blade option oder <?php echo csrf_token();//Core PHP option ?>

oder

In einigen Fällen verwenden Sie möchten die Kontrolle von CSR-Token deaktivieren in Ihrer beliebigen Ihrer Seite dann können Sie dies erreichen, indem Sie App/Http/Middleware/VerifyCsrfToken.php Datei und fügen Sie die URL in außer Array, aber DO DO, wenn es die einzige Option ist nicht empfohlen, weil es deaktiviert eine Sicherheitsfunktion von Laravel.

0

ich weiß, die Frage bereits beantwortet ist, aber das ist etwas mehr Informationen mit der Antwort an,

Es ist, weil Sie nicht das Sicherheitstoken zusammen mit Ihren Formulardaten übergeben. benutzen Sie bitte

{{ Form::open(array('url' => 'foo/bar')) }} 
    ........ 
........ 
{{ Form::close() }} 

Laravel bietet eine einfache Methode der Anwendung von Cross-Site Request Fälschungen zu schützen. Zuerst wird ein zufälliges Token in die Benutzersitzung gestellt. Wenn Sie die Form :: open-Methode mit POST, PUT oder DELETE verwenden, wird das CSRF-Token Ihren Formularen automatisch als verborgenes Feld hinzugefügt.Alternativ, wenn Sie den HTML-Code für das versteckte CSRF Feld erzeugen möchten, können Sie die Token-Methode verwenden:

echo Form::token(); 

Sie eine vollständige Dokumentation in diesem Link http://laravel.com/docs/4.2/html

1

Ich sehe, dass diese Frage wurde finden aufgelöst, aber daran gedacht, diese Informationen zu teilen.

CSRF Schutz

Laravel standardmäßig behandelt C ROSS S ite R equest F orgeries. Bevor wir Formulare aus unserer Anwendung veröffentlichen, müssen wir ein CSRF-Token hinzufügen, um die aktive Benutzersitzung anzuzeigen. Dieses Token wird überprüft, um die Authentizität des Benutzers festzustellen, der es veröffentlicht.

CSRF Hinzufügen Token

Innerhalb der Form könnten wir ein verstecktes Feld, dessen Wert halten die csrf Token ebenfalls sein:

(Blattvorlage)

<input type="hidden" name="_token" value="{{ csrf_token() }}"> 

In meinem Anwendung (Laravel 5.1) Ich habe illuminate/html Fassaden verwendet. Wenn ich ein Formular wie unten gezeigt anschließe, fügt die Methode Form::open automatisch das oben angezeigte versteckte Feld zu diesem Formular hinzu.

{!! Form::open(array('action' => '[email protected]','method' => 'POST'))!!} 

Sie in der Middleware/VerifyCsrfToken.php Datei feststellen können, eine Funktion definiert wurde das Token Spiel zu überprüfen.

CSRF In AJAX Anfrage

Für AJAX-Request in Ihrer Anwendung können Sie die CSRF-Token zusammen mit der Ajax-Post übergeben. Speichern Sie das Token im Meta-Tag.

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

In Ajax-Aufruf

$.ajax({ 
    url: '/postAjaxUrl', 
    type: 'POST', 
    dataType: 'json', 
    data: {user_id: 10}, 
    success: function(response) { 
     console.log(response);        
    }, 
    beforeSend: function (request) {      
     return request.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-token']").attr('content')); 
    } 
}); 

ODER

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 
// This will automatically include the CSRF token in all ajax request 

Hoffe, das ist hilfreich. :)

Verwandte Themen