14

最近一直在研究 laravel,并试图找出他们拥有的 CSRF 保护。但是,我无法让它工作。有什么方法可以使用 CSRF 过滤器验证所有提交的帖子请求?我已经看到 laravel 系统有:

    App::before(function($request)
{
    //
});

我如何能够将它与 CSRF 过滤器一起使用?一直在尝试一些不同的事情,比如

App::before(function($request)
{
    Route::filter('csrf','post');
});

但我可能离这里很远..这将如何工作?或者甚至可以这样做吗?

4

7 回答 7

30

这是最好和最简单的解决方案:

Route::when('*', 'csrf', array('post'));

无需对路线进行分组或与构造函数混淆。

于 2014-04-08T09:51:36.057 回答
23

You can use route groups. This will apply the specified options to any routes defined in a group:

Route::group(array('before' => 'csrf'), function()
{
    Route::post('/', function()
    {
    // Has CSRF Filter
    });

    Route::post('user/profile', function()
    {
    // Has CSRF Filter
    });

    Route::post(....);
});

For certain routes, or if grouping isn't what you want, you can also use a pattern filter:

//all routes beginning with admin, sent via a post http request will use the csrf filter
Route::when('admin/*', 'csrf', array('post'));

NOTE: this code would go in your routes.php file

于 2013-06-27T00:02:27.800 回答
11

在我的 BaseController 我有这个:

public function __construct()
{
    $this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
    $this->beforeFilter('ajax', array('on' => array('delete', 'put')));
}

拥有这样App::before的过滤器是一种有趣的方法,但我不知道哪个更好?

于 2013-06-26T20:55:04.993 回答
4

出于某种原因

$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));

进入 BaseController.php 对我不起作用;我用假令牌做了测试。所以我提出了以下解决方案:

路线.php:

Route::group(array('before' => 'csrf'), function() {
    Route::resource('areas', 'AreaController');
    Route::resource('usuarios', 'UsuarioController');
    // ... more stuff
});

filters.php(csrf 过滤器部分):

Route::filter('csrf', function()
{
    if ($_SERVER['REQUEST_METHOD'] === 'POST' || $_SERVER['REQUEST_METHOD'] === 'PUT') {
        if (Session::token() != Input::get('_token'))
        {
            throw new Illuminate\Session\TokenMismatchException;
        }
    }
});

这对我有用。

于 2013-09-25T22:09:01.460 回答
4

这将允许您将 CSRF 应用于应用程序所有页面的所有表单

App::before(function($request)
{
    if ($request->getMethod() === 'POST') {
        Route::callRouteFilter('csrf', [], '', $request);
    }
});

注意:'post' 是 HTTP POST 动词 - 所以它将涵盖 Laravel 的 post、put、delete 请求等。

于 2014-01-12T11:46:06.920 回答
0

只需将此添加到BaseController.

// Be sure to call parent::__construct() when needed
public function __construct()
{
    // Perform CSRF check on all post/put/patch/delete requests
    $this->beforeFilter('csrf', array('on' => array('post', 'put', 'patch', 'delete')));
}

这会将 CSRF 过滤器添加到所有 post、put、patch 和 delete 请求。

于 2014-12-06T08:45:02.540 回答
0

您提供的代码仅创建过滤器。您仍然需要在 ROUTER 或 CONTROLLER 中使用它(如果需要,甚至在基本控制器中)。

在我看来,在您的 ROUTES 中使用过滤器是使用它的最佳场所。

于 2013-06-27T01:20:14.657 回答