[英]Laravel TokenMismatchException
現在我正在學習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
可能有什么不對?
在表單的結束標記之前添加此行:
{{ Form::token() }}
為防止對laravel應用程序的攻擊,laravel會在您的表單中添加一個CSR令牌,在表單作為安全選項提交時檢查該表示,因此如果您收到此錯誤,則表示您的表單不包含CSR令牌,因此包含令牌在您的表單中,您可以使用{{ crsf_token() }} //blade option
或<?php echo csrf_token();//Core PHP option ?>
要么
在某些情況下,您可能希望在您的任何頁面中禁用CSR令牌檢查,然后您可以通過編輯app / Http / Middleware / VerifyCsrfToken.php文件並在除陣列之外添加URL來實現此目的,但請執行此操作,如果它是唯一的不建議使用OPTION,因為它會禁用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
方法會自動將上面顯示的隱藏字段添加到該表單。
{!! 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提供了一種簡單的方法來保護您的應用程序免受跨站點請求偽造。 首先,隨機令牌放在用戶的會話中。 如果您使用帶有POST,PUT或DELETE的Form :: open方法,CSRF令牌將自動作為隱藏字段添加到您的表單中。 或者,如果您希望為隱藏的CSRF字段生成HTML,則可以使用令牌方法:
echo Form::token();
你可以在這個鏈接http://laravel.com/docs/4.2/html找到完整的文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.