CSRF Token Mismatch Laravel 4

时间:2013-11-21 19:11:44

标签: laravel-4

这让我发疯了。无论是从Laravel表单还是从AJAX,我都会在每个POST上获得令牌不匹配。我在过滤器中添加了一些代码,向我展示会话与_token:

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' => 'example@gmail.com', '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',这是我们服务器上的缓存引擎。

想法?

4 个答案:

答案 0 :(得分:2)

您没有使用_token请求提交POST

添加

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

之前{{Form::close()}}

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

答案 1 :(得分:1)

您的会话是否已保存到数据库中?就我而言,他们不是。 来自#laravel IRC的AndreasLutro建议检查这个问题! https://github.com/laravel/framework/issues/4441

答案 2 :(得分: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;
    }
});

这是只是一个快速修复,可以在有人找到解决方案之前启动我的应用程序。

答案 3 :(得分:0)

我在本地计算机上遇到了这个问题。我在网络服务器上运行Laravel并且csrf令牌运行良好,但不在我的本地计算机上。

我在本地计算机上设置了缓存文件。

我发现会话没有得到保存。我通过更改&#34;存储/会话&#34;的权限来修复此问题。我本地计算机上的文件夹(不是服务器!)到777。