2015-07-15 9 views
6

In questo momento mi sto istruzionene laravel ma continuo a ricevere l'exeption:laravel TokenMismatchException

TokenMismatchException in linea VerifyCsrfToken.php 53:

Sto cercando di rendere un oggetto di una migrazione e poi scriverlo nel database ma per qualche motivo non funziona. Questo è il mio route.php:

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

Questo è il mio controller chiamato blog.php:

uso Illuminate \ Http \ Request;

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

Questa è la migrazione:

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

e questo è il mio punto di vista principale:

@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 

Cosa c'è di sbagliato?

risposta

3

Aggiungere questa riga prima del tag del modulo di chiusura:

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

Grazie per la risposta. Sfortunatamente non funziona. – Jamie

+1

Questa è un'altra opzione: '{!! csrf_field() !!} 'Quindi provalo come suggerito da @JaviStolz. – Michel

+0

grazie che funziona! Ora mi sta dicendo: Classe 'App \ Http \ Controllers \ Input' non trovata – Jamie

4

Aggiungere questo proprio prima </form>

{!! csrf_field() !!} 

Date un'occhiata a Laravel docs per ulteriori informazioni

+0

Grazie funziona. – Jamie

+0

Felice di sentire. Dovresti contrassegnare la domanda come risposta per aiutare le persone che affrontano lo stesso problema. –

+0

Già fatto. – Jamie

2

Per prevenire attacchi su la tua applicazione laravel laravel aggiunge un token CSR al tuo modulo che viene controllato quando il modulo viene inoltrato sul lato server come opzione di sicurezza, quindi se u sono sempre questo errore significa che il modulo non contiene CSR pedina in modo da includere token nel vostro modulo è possibile utilizzare {{ crsf_token() }} //blade option o <?php echo csrf_token();//Core PHP option ?>

o

In alcuni casi si consiglia di disabilitare il controllo della RSI Token in una qualsiasi delle tue pagine puoi ottenere questo modificando l'app /Http/Middleware/VerifyCsrfToken.php e aggiungere l'URL tranne l'array ma FARE QUESTO SE È L'UNICA OPZIONE sconsigliata perché disabilita una funzione di sicurezza di laravel.

0

So che la domanda è già una risposta, ma questo è di aggiungere alcune informazioni in più con la risposta,

E 'perché non si sta passando il token di sicurezza insieme con i vostri dati del modulo. si prega di utilizzare

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

laravel fornisce un metodo semplice per proteggere la tua applicazione dal cross-site request falsificazioni. Innanzitutto, un token casuale viene inserito nella sessione dell'utente. Se si utilizza il metodo Form :: open con POST, PUT o DELETE, il token CSRF verrà aggiunto automaticamente ai moduli come campo nascosto.In alternativa, se si desidera generare il codice HTML per il campo CSRF nascosta, è possibile utilizzare il metodo token:

echo Form::token(); 

è possibile trovare la documentazione completa in questo link http://laravel.com/docs/4.2/html

1

vedo che la questione è stata risolto ma pensato di condividere queste informazioni.

CSRF protezione

laravel predefinita gestita C ross S ite R equest F orgeries. Prima di pubblicare qualsiasi modulo dalla nostra applicazione, è necessario aggiungere un token CSRF per indicare la sessione utente attiva. Questo token viene verificato per determinare l'autenticità dell'utente che lo pubblica.

Aggiunta CSRF token di

All'interno del modulo potevamo tenere un campo nascosto il cui valore sarà il token CSRF allo stesso modo:

(modello di lama)

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

All'interno del mio applicazione (Laravel 5.1) Ho usato le facciate illuminate/html. Quando aggiungo un modulo come mostrato di seguito, il metodo Form::open aggiungerebbe automaticamente il campo nascosto sopra indicato a quel modulo.

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

È possibile notare all'interno del file Middleware/VerifyCsrfToken.php, una funzione è stata definita per controllare il match token.

CSRF Nel richiesta AJAX

Per richiesta AJAX all'interno dell'applicazione è possibile passare il CSRF token di insieme con il post ajax. Archivia il token nel meta tag.

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

In Ajax chiamate

$.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')); 
    } 
}); 

O

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

Spero che questo è utile. :)