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

时间:2015-02-17 08:14:33

标签: php laravel laravel-4 csrf

Laravel上有一些选项允许Laravel创建一个令牌并在服务器端测试它以引发CSRF攻击。

我在Laravel网站上找到了this,但没有说明如何从Controller检查是一次攻击还是来自原生和真实页面。

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

2 个答案:

答案 0 :(得分:9)

回答Laravel 5

在Laravel 5中,中间件取代了过滤器。 CSRF也是如此。默认情况下启用中间件,并在App\Http\Middleware\VerifyCsrfToken

中处理

可以通过移除App\Http\Middleware\VerifyCsrfToken中的App\Http\Kernel来停用它。如果移到$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');
}

答案 1 :(得分:1)

假设你使用了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;
    }
});