【问题标题】:How to check a token (CSRF) on controller?如何检查控制器上的令牌(CSRF)?
【发布时间】:2015-04-17 21:46:29
【问题描述】:

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

我在 Laravel 网站上找到了this,但没有说明如何从 Controller 或从本机和真实页面进行检查。

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

【问题讨论】:

  • 这个问题很重要:你使用的是 Laravel 5 还是 4?
  • @lukasgeiter 谢谢,我使用的是 Laravel 4.2,但项目完成后我将切换到 5
  • @lukasgeiter 有什么区别?

标签: php laravel laravel-4 csrf


【解决方案1】:

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 4,因此只需接受其他答案即可。我刚刚添加了此答案,因为您要求区别,并且在简短的评论中并不能轻易解释;)
【解决方案2】:

假设你使用 laravel 4.x:

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

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

如果你想在token不正确的时候做点什么,你可以更改app/filters.php中的过滤器。这个:

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

【讨论】:

  • 这么好的答案,Laravel 4 和 5 呢,女巫一个是不同的
  • 我的意思是这个答案适用于 Laravel 4 或 5?
  • 这个答案适用于 Laravel 4
猜你喜欢
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2013-03-27
  • 2018-01-18
  • 2015-06-09
  • 2014-07-18
  • 2020-10-12
相关资源
最近更新 更多