现在我正在学习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
可能有什么不对?
答案 0 :(得分:4)
答案 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();
中找到完整的文档