Laravel上有一些选项允许Laravel创建一个令牌并在服务器端测试它以引发CSRF攻击。
我在Laravel网站上找到了this,但没有说明如何从Controller检查是一次攻击还是来自原生和真实页面。
如何检查控制器上的令牌(CSRF)?
答案 0 :(得分:9)
在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;
}
});