如何检查控制器上的令牌(CSRF)?
How to check a token (CSRF) on controller?
Laravel 上有一些选项,我们允许 Laravel 创建令牌并在服务器端测试它以引发 CSRF 攻击。
我在 Laravel 网站上找到 this,但没有说明如何从 Controller 或本机和真实页面检查是攻击。
如何检查控制器上的令牌(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;
}
});
回答 Laravel 5
在 Laravel 5 middleware 中替换过滤器。 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 上有一些选项,我们允许 Laravel 创建令牌并在服务器端测试它以引发 CSRF 攻击。
我在 Laravel 网站上找到 this,但没有说明如何从 Controller 或本机和真实页面检查是攻击。
如何检查控制器上的令牌(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;
}
});
回答 Laravel 5
在 Laravel 5 middleware 中替换过滤器。 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');
}