Laravel令牌不匹配异常

6

我现在正在学习laravel,但我一直遇到这个异常:

VerifyCsrfToken.php的TokenMismatchException第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

可能有什么问题?
5个回答

4

将这段代码添加在</form>标签之前。

{!! csrf_field() !!}

请查看Laravel文档获取更多信息。

很高兴听到这个消息。你应该将问题标记为已解决,以帮助遇到相同问题的人。 - Javi Stolz

3
在表单的结束标签之前添加以下代码:
{{ Form::token() }}

谢谢你的回复。不幸的是那不起作用。 - Jamie
1
这是另一种选择:{!! csrf_field() !!}。所以按照@JaviStolz的建议尝试它。 - Michel
谢谢,那个有效!现在它告诉我:找不到类“App\Http\Controllers\Input”。 - Jamie
你试过使用 $posts->title = $request->input('title'); 而不是 $posts->title = Input::get('title'); 吗? - Michel

2
为了防止对您的Laravel应用程序进行攻击,Laravel会向您的表单添加一个CSR令牌,在服务器端提交表单时检查该令牌作为一种安全选项。因此,如果您遇到此错误,则意味着您的表单不包含CSR令牌。要在表单中包含令牌,您可以使用以下选项之一:{{ crsf_token() }} //blade option<?php echo csrf_token();//Core PHP option ?>。请注意,保留HTML标签。
在某些情况下,您可能希望禁用任何页面中CSR令牌的检查。这可以通过编辑app/Http/Middleware/VerifyCsrfToken.php文件并将URL添加到except数组中来实现。但是只有在没有其他选择的情况下才这样做,因为它会禁用Laravel的安全功能。请注意,保留HTML标签。

1

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

CSRF保护

Laravel默认处理跨站请求伪造。在我们的应用程序中发布任何表单之前,我们需要添加CSRF令牌以指示活动用户会话。验证此令牌以确定发布它的用户的真实性。

添加CSRF令牌

在表单中,我们可以保留一个隐藏字段,其值将是csrf令牌,如下所示:

(blade模板)

<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 post一起传递。将令牌存储在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'));
    }
 });

OR

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

希望这有所帮助。 :)

0

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

问题出在你没有将安全令牌与表单数据一起传递。请使用

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

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

echo Form::token();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接