簡體   English   中英

Laravel TokenMismatchException

[英]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>之前添加此權限

{!! csrf_field() !!}

請查看Laravel文檔以獲取更多信息

在表單的結束標記之前添加此行:

{{ 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::openForm::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM