2013-11-21 68 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