如何检查控制器上的令牌(CSRF)


How to check a token (CSRF) on controller?

在Laravel上有一些选项,我们允许Laravel创建一个令牌,并在服务器端对其进行测试,以引发CSRF攻击。

我在Laravel网站上发现了这一点,但没有说明如何从Controller检查这是一个攻击或从本地和真实的页面。

如何检查控制器上的令牌(CSRF)

Laravel 5的答案

在Laravel 5中,中间件替换过滤器。CSRF也是如此。中间件默认启用,并在App'Http'Middleware'VerifyCsrfToken中进行处理。

可以通过删除App'Http'Kernel中的App'Http'Middleware'VerifyCsrfToken来禁用它。如果移动到$routeMiddleware。。。

protected $routeMiddleware = [
    'auth' => 'App'Http'Middleware'Authenticate',
    'auth.basic' => 'Illuminate'Auth'Middleware'AuthenticateWithBasicAuth',
    'guest' => 'App'Http'Middleware'RedirectIfAuthenticated',
    'csrf' => 'App'Http'Middleware'VerifyCsrfToken',
];

它可以通过将其添加到一个路由来有条件地使用:

Route::post('foo', ['middleware' => 'csrf', 'uses' => 'BarController@foo']);

或者在控制器构造函数中:

public function __construct(){
    $this->middleware('csrf');
}

假设您使用laravel 4.x:

您不需要在控制器中检查此项。定义before参数告诉laravel自动检查。

Route::post('profile', array('before' => 'csrf', function(){ 
    /* CSRF validated! */  
}));

如果您想在令牌不正确时执行某些操作,可以更改app/filters.php中的筛选器。这个:

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