【问题标题】:Laravel TokenMismatchExceptionLaravel TokenMismatchException
【发布时间】:2015-10-04 08:13:12
【问题描述】:

现在我正在学习 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

可能出了什么问题?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    &lt;/form&gt;之前添加这个

    {!! csrf_field() !!}
    

    查看Laravel docs 了解更多信息

    【讨论】:

    • 很高兴听到。您应该将问题标记为已回答,以帮助面临同样问题的人。
    【解决方案2】:

    在表单的结束标记之前添加这一行:

    {{ Form::token() }}
    

    【讨论】:

    • 感谢您的回复。不幸的是,这不起作用。
    • 这是另一种选择:{!! csrf_field() !!} 所以按照@JaviStolz 的建议尝试一下。
    • 谢谢你的工作!现在它告诉我:找不到类 'App\Http\Controllers\Input'
    • 你试过$posts-&gt;title = $request-&gt;input('title');而不是$posts-&gt;title = Input::get('title');吗?
    【解决方案3】:

    为了防止对您的 laravel 应用程序的攻击,laravel 将 CSR 令牌添加到您的表单中,当表单在服务器端提交时作为安全选项进行检查,因此如果您收到此错误,则表示您的表单不包含 CSR 令牌所以要在表单中包含令牌,您可以使用 {{ crsf_token() }} //blade option&lt;?php echo csrf_token();//Core PHP option ?&gt;

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

    【讨论】:

      【解决方案4】:

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

      CSRF 保护

      Laravel 默认处理 Cross Site Request 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 文件中,定义了一个函数来检查令牌匹配。

      AJAX 请求中的 CSRF

      对于应用程序中的 AJAX 请求,您可以将 CSRF 令牌与 ajax 帖子一起传递。将令牌存储在元标记中。

      <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
      

      希望这会有所帮助。 :)

      【讨论】:

        【解决方案5】:

        我知道这个问题已经回答了,但这是为了在答案中添加一些额外的信息,

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

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

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

        echo Form::token();
        

        您可以在此链接中找到完整的文档http://laravel.com/docs/4.2/html

        【讨论】:

          猜你喜欢
          • 2016-03-06
          • 2017-03-28
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-22
          相关资源
          最近更新 更多