Laravel TokenMismatchException

时间:2015-07-15 10:26:40

标签: php laravel

现在我正在学习laravel,但我一直在学习:

  

VerifyCsrfToken.php第53行中的TokenMismatchException:

我正在尝试创建一个迁移对象,然后将其写入数据库但由于某种原因它无法正常工作。这是我的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

可能有什么不对?

4 个答案:

答案 0 :(得分:4)

</form>

之前添加此权限
{!! csrf_field() !!}

查看Laravel docs了解更多信息

答案 1 :(得分:2)

为了防止对您的laravel应用程序的攻击,laravel会在您的表单中添加一个CSR令牌,在表单作为安全选项提交时会检查该表单,因此如果您收到此错误,则表示您的表单不包含CSR为了在表单中包含令牌,您可以使用{{ crsf_token() }} //blade option<?php echo csrf_token();//Core PHP option ?>

在某些情况下,您可能希望在您的任何页面中禁用CSR令牌检查,然后您可以通过编辑 app / Http / Middleware / VerifyCsrfToken.php 文件并添加URL来实现此目的除了数组,但是这样做,如果它是唯一的选项不建议使它禁用laravel的安全功能。

答案 2 :(得分:1)

我看到这个问题已经解决,但想过分享这些信息。

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

OR

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

希望这有帮助。 :)

答案 3 :(得分:0)

我知道问题已经得到解答,但这是在答案中添加一些额外的信息,

这是因为您没有将安全令牌与表单数据一起传递。 请使用

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

Laravel提供了一种简单的方法来保护您的应用程序免受跨站点请求伪造。首先,随机令牌放在用户的会话中。如果您使用带有POST,PUT或DELETE的Form :: open方法,CSRF令牌将自动作为隐藏字段添加到您的表单中。或者,如果您希望为隐藏的CSRF字段生成HTML,则可以使用令牌方法:

echo Form::token();

您可以在此链接http://laravel.com/docs/4.2/html

中找到完整的文档