所有POST请求上的Laravel 4 CSRF

时间:2013-06-26 20:34:32

标签: php laravel csrf

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

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

我如何在CSRF过滤器中使用它?正在尝试一些不同的事情,如

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

但我可能会离开这里..这怎么会有用?或者甚至可以这样做?

7 个答案:

答案 0 :(得分:30)

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

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

无需分组路线或弄乱构造函数。

答案 1 :(得分:23)

您可以使用路线组。这会将指定的选项应用于组中定义的任何路径:

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

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

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

对于某些路线,或者如果分组不是您想要的,您还可以使用模式过滤器:

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

注意:此代码将包含在routes.php文件中

答案 2 :(得分:11)

在我的BaseController中我有这个:

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

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

答案 3 :(得分:4)

出于某种原因推出

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

进入BaseController.php对我不起作用;我用假代币做了测试。所以我带来了以下解决方案:

routes.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;
        }
    }
});

这对我有用。

答案 4 :(得分:4)

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

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

注意:'post'是HTTP POST动词 - 因此它将涵盖Laravel发布,发送,删除请求等。

答案 5 :(得分:0)

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

在我看来,使用ROUTES中的过滤器是使用它的最佳位置。

答案 6 :(得分: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过滤器添加到所有发布,放置,修补和删除请求中。