2014-09-26 95 views
0

我有一个问题,因为1周或多或少,当我离开我的应用程序的页面,但没有使用它可能4或5小时,并返回作出请求(在点击一个按钮来加载的东西或类似的东西),每次在控制台中显示此:Laravel 4,使用CSRF过滤器.php中的令牌不匹配异常使用CSRF

{ 
"error":{ 
    "type":"Illuminate\\Session\\TokenMismatchException", 
    "message":"", 
    "file":"C:\\xampp182\\htdocs\\mysite\\app\\filters.php", 
    "line":97 
    } 
} 

我使用CSRFprotección我通过为Ajax请求该配置

$.ajax({ 
     url: '/path/to/file', 
     type: 'default GET (Other values: POST)', 
     dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)', 
     data: {param1: 'value1'}, 
     headers: { 
      'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') 
     }, 
    }) 
    .done(function() { 
     console.log("success"); 
    }) 
    .fail(function() { 
     console.log("error"); 
    }) 
    .always(function() { 
     console.log("complete"); 
    }); 
POST请求

这是我的filters.php

/* 
|-------------------------------------------------------------------------- 
| CSRF Protection Filter 
|-------------------------------------------------------------------------- 
| 
| The CSRF filter is responsible for protecting your application against 
| cross-site request forgery attacks. If this special token in a user 
| session does not match the one given in this request, we'll bail. 
| 
*/ 

Route::filter('csrf', function($route, $request) 
{ 
    if (strtoupper($request->getMethod()) === 'GET') 
    { 
     return; // get requests are not CSRF protected 
    } 

    $token = Request::ajax() ? Request::header('x-csrf-token') : Input::get('_token'); 

    if (Session::token() != $token) 
    { 
     throw new Illuminate\Session\TokenMismatchException; //Line 97 
    } 
}); 

编辑

我看到了问题,对话::令牌()和$令牌是不同的,但有没有办法再生或者把两个标记具有相同的价值?

+0

也许,这个答案是有帮助的。 [上登录令牌不匹配异常(Laravel)] [1] [1]:HTTP://计算器。COM /问题/ 22066241 /令牌不匹配,异常的登录-laravel/28361491#28361491 – 2015-02-06 08:34:12

回答

0

这是CSRF保护的工作原理。会话生存期后,它会生成新的令牌。通常没有人会填写4-5小时的表格。如果你这样做只是为了在本地主机上进行测试,你可以将lifetimeapp/config/session更改为更高的值,它应该可以工作。

否则你可能会可能会改变:

throw new Illuminate\Session\TokenMismatchException; //Line 97 

到类似的东西

return Redirect:back()->withInput(Input::except('token'))->with('_token',Session::token()); 
0

我对登录这个问题也。不时发生这种异常,所以我停下来试图重现它。我通过这样做成功:

首先我加载登录页面。

然后我删除了cookies。

然后,无需重新加载登录页面,我输入了用户名和密码并尝试登录。

因为会话被删除(当我删除了cookies),这是正常的,这段代码不会通过,它会抛出TokenMismatchException。

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

所以,我做了什么来解决我的问题是,添加一个重定向到登录页面,提示信息通知,本次会议可能过期的用户。

Route::filter('csrf', function() { 
    if (Session::getToken() != Input::get('_token')) { 
     return Redirect::to('/admin/login')->with('warning', 'Your session has expired. Please try logging in again.'); 
    } 
}); 

因此,页面重新加载后,会创建一个新的会话并解决问题。

0

只要把下面的代码到您的过滤器:

if (Session::token() !== $token) 
{ 
    return Redirect::back()->withInput(Input::except('_token')); 
}