Что Laravel TokenMismatchException

прямо сейчас я изучаю laravel, но я продолжаю получать exeption:

TokenMismatchException в VerifyCsrfToken.php строка 53:

Я пытаюсь сделать объект миграции, а затем записать его в базу данных, но по какой-то причине он не работает. Это мой маршрут.на PHP:

Route::get('/post/new',array(
'uses'=> 'blog@newPost',
'as' => 'newPost'
    ));
Route::post('/post/new', array (
'uses' => 'blog@createPost',
'as' => 'createPost'
    ));

Это мой контроллер под названием Блог.на PHP:

использовать IlluminateHttpRequest;

use AppHttpRequests;
use View;
use AppHttpControllersController;
use Appposts;

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

это миграция:

<?php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

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

и это мой основной вид:

@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

что может быть не так?

5 ответов


добавьте эту строку перед закрывающим тегом формы:

{{ Form::token() }}

добавить перед </form>

{!! csrf_field() !!}

посмотри Laravel docs дополнительная информация


для предотвращения атак на ваш сайт Laravel приложения Laravel добавляет КСО токен в форму, которая проверяется при отправке формы на стороне сервера в качестве параметров, так что если вы получаете это сообщение об ошибке означает, что ваша форма не содержит КСО маркер, чтобы включить маркер в форме вы можете использовать {{ crsf_token() }} //blade option или <?php echo csrf_token();//Core PHP option ?>

или

в некоторых случаях вы можете отключить проверку токена CSR на любой Вашей странице, тогда вы можете достичь этого путем редактирования app / Http / Middleware / VerifyCsrfToken.в PHP файл и добавить URL-адрес В кроме массива, но СДЕЛАЙТЕ ЭТО, ЕСЛИ ЭТО ЕДИНСТВЕННЫЙ ВАРИАНТ не рекомендуется, потому что он отключает функцию безопасности laravel.


Я вижу, что этот вопрос был решен, но думал поделиться этой информацией.

защита CSRF

Laravel по умолчанию обрабатывается CРосс Site Rзаявление нужно Forgeries. Перед отправкой любых форм из нашего приложения нам нужно добавить токен CSRF, чтобы указать активный сеанс пользователя. Этот токен проверяется для определения подлинности пользователя его размещения.

добавление токена CSRF

в форме мы могли бы сохранить скрытое поле, значение которого будет токеном csrf аналогично:

(шаблон лезвие)

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

в моем приложении (Laravel 5.1) я использовал illuminate/html фасады. Когда я добавляю форму, как показано ниже Form::open метод автоматически добавит показанное выше скрытое поле в эту форму.

{!! Form::open(array('action' => 'TestController@index','method' => 'POST'))!!}

вы можете заметить в Middleware/VerifyCsrfToken.php файл, функция была определена для проверки соответствия маркеров.

CSRF в запросе AJAX

для запроса AJAX в вашем приложении вы можете передать токен CSRF вместе с сообщением ajax. Сохраните маркер в теге meta.

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

В Ajax Вызов

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

или

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

надеюсь, это полезно. :)


Я знаю, что на вопрос уже ответили, но это добавить дополнительную информацию с ответом,

это потому, что вы не передаете маркер безопасности вместе с данными формы. пожалуйста, используйте

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

Laravel обеспечивает простой способ защиты вашего приложения от подделок межсайтовых запросов. Во-первых, случайный токен помещается в сеанс пользователя. Если вы используете метод Form:: open с POST, PUT или DELETE, токен CSRF будет добавлен к вашему автоматически формирует скрытое поле. Кроме того, если вы хотите создать HTML для скрытого поля CSRF, вы можете использовать метод токена:

echo Form::token();

вы можете найти полную документацию по этой ссылке http://laravel.com/docs/4.2/html