2013-11-21 112 views
2

這讓我瘋狂。無論是從Laravel表單還是從AJAX,我都會在每個POST中獲取標記不匹配。我添加了一些代碼來過濾,以顯示我的會議與_token:CSRF令牌不匹配Laravel 4

Route::filter('csrf', function() 
{ 
if ($_SERVER['REQUEST_METHOD'] !== 'GET') { 

    $token = Input::has('_token') ? Input::get('_token') : ''; 
    $sessionToken = Session::token(); 

    if ($sessionToken != $token) 
    { 
     $message = 'Token mismatch'; 

     // This one is for debug purposes only 
     return Response::json(['flash' => "$message; session: $sessionToken ; yours : $token"], 401); 

     return Response::json(['flash' => $message], 401); 
    } 
    } 
    }); 

這裏的登錄表單:

 {{ Form::open(array('route' => 'sessions.store')) }} 

     <div class="form-group"> 
      {{ Form::label('email', 'Email Address') }} 
      {{ Form::text('email', '', array('placeholder' => '[email protected]', 'class' => 'form-control')) }} 
     </div> 

     <div class="form-group"> 
      {{ Form::label('password', 'Password') }} 
      {{ Form::password('password', array('placeholder' => 'Enter your password', 'class'=>'form-control')) }} 
     </div> 

     <div class="form-group"> 
      {{ Form::submit('Sign in', array('class' => 'btn login'))}} 

      <a href="{{{ URL::to('session/registration') }}}" class="btn signup">Create an Account</a> 
     </div> 

    {{ Form::close() }} 

例如登錄時,這裏是令牌不匹配的閃光燈,我得到:

{"flash":"Token mismatch; session: uN3sd8PNWUfgTuqc1RZrRfXgpGpHOEKkCtoo3XVX ; yours : Ybmn6u80rLpxIcGdahd7KT2eR6WmcaPN28arZ9kg"} 

當app/config/session.php設置爲'apc'時發生這種情況。當它被設置爲「原生」或「cookie」時,一切都很好。我將緩存設置爲'apc',這是我們服務器上的緩存引擎。

想法?

+0

嗨固定這一點。你有沒有找到這個解決方案?只有當我嘗試訪問其他電腦中的網站時纔會發生這種情況。 –

+0

奇怪的事情發生在我身上,我只是清除了Chrome緩存,它現在可以工作。 – SSR

回答

2

你是不是與你的POST要求提交_token

添加

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>" 

{{Form::close()}}

http://laravel.com/docs/security#protecting-routes

+1

它實際上是使用Laravel 4自動添加的,並存在於DOM中。 –

+0

我的不好。直到最後我還沒有讀過這個問題。 – tharumax

+0

這實際上解決了我的問題。我沒有想到在我的ajax請求中包含表單令牌。 –

0

我有這樣的問題太多,我不知道實際的方法來解決這個問題。我認爲這是一個錯誤,但我需要我的應用程序才能運行。因此,這裏的原始app/filter.php文件:

Route::filter('csrf', function() { 
    if (Session::token() != Input::get('_token')) 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 

我修改它使用csrf_token()功能和它的工作對我來說,

Route::filter('csrf', function() { 
    if (csrf_token() != Input::get('_token')) { 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 

這是只是一個權宜之計讓我的應用程序並使其工作在有人找出解決方案之前。

+2

這沒有意義,因爲csrf_token()只是返回Session :: token() – Benubird

+0

不適合我! – 2plus

0

我碰到了我的本地計算機上此問題。我有Laravel在Web服務器上運行,並且csrf令牌運行良好,但不在本地計算機上運行。

我有緩存設置爲我的本地計算機上的文件。

我發現會議並沒有獲得拯救。我改變我的本地機器(而不是服務器!)關於「存儲/會話」文件夾的權限爲777