Прямо сейчас я лечу laravel, но я продолжаю получать освобождение:
TokenMismatchException в строке VerifyCsrfToken.php 53:
Я пытаюсь создать объект миграции, а затем записываю его в базу данных, но по какой-то причине он не работает. Это мой route.php:
Route::get('/post/new',array( 'uses'=> 'blog@newPost', 'as' => 'newPost' )); Route::post('/post/new', array ( 'uses' => 'blog@createPost', 'as' => 'createPost' ));
Это мой контроллер, называемый blog.php:
используйте 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(); } }
Это миграция:
<?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'); } }
И это мой главный взгляд:
@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
Что может быть неправильным?
Добавьте эту строку перед закрывающим тегом формы:
{{ Form::token() }}
Добавьте это прямо перед </form>
{!! csrf_field() !!}
Взгляните на документы Laravel для получения дополнительной информации
Чтобы предотвратить атаки на ваше приложение laravel, laravel добавляет токен CSR к вашей форме, который проверяется, когда форма отправляется на стороне сервера в качестве параметра безопасности, поэтому, если вы получаете эту ошибку, означает, что ваша форма не содержит токена CSR, поэтому для включения токена в вашей форме вы можете использовать {{ crsf_token() }} //blade option
или <?php echo csrf_token();//Core PHP option ?>
или
В некоторых случаях вы можете отключить проверку токена CSR на своей странице, тогда вы можете это сделать, отредактировав файл app / Http / Middleware / VerifyCsrfToken.php и добавьте URL-адрес в массив, но НЕ СДЕЛАЙТЕ ЭТО, ЕСЛИ ЕСТЬ ТОЛЬКО ВАРИАНТ не рекомендуется, потому что он отключает функцию безопасности laravel.
Я вижу, что этот вопрос был разрешен, но подумал об обмене этой информацией.
Защита CSRF
Laravel по умолчанию обрабатывает C ross S ite R equest F orgeries. Перед публикацией любых форм из нашего приложения нам нужно добавить токен 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 name="csrf-token" content="{{ csrf_token() }}" />
В Ajax Call
$.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