2015-07-15 24 views
6

Şu anda laravel learing ama ben exeption almaya devam:laravel TokenMismatchException

TokenMismatchException 53 VerifyCsrfToken.php hat girişi:

Bir göçün bir nesne yapmaya çalışıyorum ve daha sonra veritabanına yazın ama bazı nedenlerle çalışmıyor. Bu benim denetleyicisi blog.php denir

Route::get('/post/new',array(
'uses'=> '[email protected]', 
'as' => 'newPost' 
    )); 
Route::post('/post/new', array (
'uses' => '[email protected]', 
'as' => 'createPost' 
    )); 

: Bu benim route.php olduğunu

kullanım Illuminate \ Http \ İsteği;

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(); 
     } 
    } 

Bu

göç:

<?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'); 
    } 
} 

Ve bu benim ana görünümdür:

@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 

Ne yanlış olabilir? yapılan saldırıları önlemek için daha fazla bilgi

için

cevap

3

formunuzun kapanış etiketinden önce bu satırı ekleyin laravel uygulama laravel, formunuza sunucu tarafında bir güvenlik seçeneği olarak gönderildiğinde kontrol edilen bir CSR belirteci ekler. u Bu hata formu kullanabilirsiniz formunuzda belirteci dahil etmek simge böylece CSR içermiyor demektir alıyorsanız {{ crsf_token() }} //blade option veya <?php echo csrf_token();//Core PHP option ?>

ya da bazı durumlarda

Eğer CSR belirteci çeki devre dışı bırakmak isteyebilirsiniz sayfanızdan herhangi birinde uygulamasını/Http/Middleware/VerifyCsrfToken.php dosyasını düzenleyerek ve diziyi dizini içine ekleyerek bunu başarabilirsiniz. YALNIZCA OPSİYON SEÇENEĞİNİZ BU bir güvenlik özelliğini devre dışı bırakır laravel

+0

Cevabınız için teşekkür ederiz. Ne yazık ki bu işe yaramıyor. – Jamie

+1

Bu başka bir seçenek: '{!! csrf_field() !!} '@JaviStolz'un önerdiği gibi deneyin. – Michel

+0

işe yaradığı için teşekkürler! Şimdi bana söylüyor: Sınıf 'App \ Http \ Controllers \ Input' bulunamadı – Jamie

4

</form>

{!! csrf_field() !!} 

önce bu hakkı ekleyin:

+0

Teşekkür ederim. – Jamie

+0

Duyduğuma sevindim. Sorunu aynı sorunla karşılaşan insanlara yardım etmek için yanıt olarak işaretlemelisiniz. –

+0

Zaten bunu yaptı. – Jamie

0

i soru zaten cevap biliyorum ama bu belirteci birlikte form verilerinden güvenliği geçmezken, çünkü öyle,

cevap bazı ekstra bilgi eklemektir. laravel siteler arası isteği sahte uygulamanızın korumanın kolay bir yöntem sağlar

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

kullanınız. İlk olarak, kullanıcı oturumunuza rastgele bir jeton yerleştirilir. Form :: open yöntemini POST, PUT veya DELETE ile kullanırsanız, CSRF belirteci formlarınıza otomatik olarak gizli alan olarak eklenir.Bu bağlantıyı tam belgelerine bulabilirsiniz

echo Form::token(); 

http://laravel.com/docs/4.2/html

1

Bu soru olduğunu görüyoruz: Eğer gizli CSRF alan için HTML oluşturmak istiyorsanız Alternatif olarak, belirteç yöntemi kullanabilir çözüldü ama bu bilgiyi paylaşmayı düşündüm. varsayılan olarak

CSRF Koruma

laravel Ross S ite R equest F orgeries ele alınmıştır. Herhangi bir formu başvurumuzdan göndermeden önce etkin kullanıcı oturumunu belirtmek için bir CSRF belirteci eklememiz gerekir. Bu jetonun, kullanıcının onu gönderdiği orijinalin doğruluğunu belirlemek için doğrulanır. formda şu belirteç CSRF

ekleme

biz değer aynı şekilde csrf belirteci olacaktır gizli bir alan tutabilir: Within

(bıçak şablon)

<input type="hidden" name="_token" value="{{ csrf_token() }}"> 

benim Uygulama (Laravel 5.1) illuminate/html cephelerini kullandım. Aşağıda gösterildiği gibi bir form eklediğimde, Form::open yöntemi, otomatik olarak yukarıdaki gösterilen gizli alanı bu forma ekler. Sen Middleware/VerifyCsrfToken.php dosya içinde fark edebilirsiniz

{!! Form::open(array('action' => '[email protected]','method' => 'POST'))!!} 

, bir fonksiyon belirteci eşleşmeyi kontrol etmek tanımlanmıştır. Uygulama içerisindeki AJAX isteği için

AJAX istekte

CSRF Eğer ajax yazı ile belirteç birlikte CSRF geçebilir. Jetonu meta etiketinde saklayın. Ajax Çağrısı

$.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')); 
    } 
}); 

VEYA

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

Umut ise

<meta name="csrf-token" content="{{ csrf_token() }}" /> 

bu yararlıdır. :)