Php 所有POST请求上的Laravel 4 CSRF

Php 所有POST请求上的Laravel 4 CSRF,php,laravel,csrf,Php,Laravel,Csrf,最近一直在调查laravel,并试图找出他们拥有的CSRF保护。然而,我不能让它工作。是否有任何方法可以通过CSRF过滤器验证所有提交的post请求?我已经看到laravel系统有: App::before(function($request) { // }); 我怎样才能将其与CSRF滤波器一起使用?一直在尝试一些不同的事情,比如 App::before(function($request) { Route::filter('csrf','post'); }); 但

最近一直在调查laravel,并试图找出他们拥有的CSRF保护。然而,我不能让它工作。是否有任何方法可以通过CSRF过滤器验证所有提交的post请求?我已经看到laravel系统有:

    App::before(function($request)
{
    //
});
我怎样才能将其与CSRF滤波器一起使用?一直在尝试一些不同的事情,比如

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

但我可能离这里很远。。这是怎么回事?或者甚至可以这样做吗?

在我的BaseController中,我有:

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

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

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

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文件中

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


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

出于某种原因

$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
进入BaseController.php对我不起作用;我用假代币做了测试。因此,我提出了以下解决方案:

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

Route::group(array('before' => 'csrf'), function() {
    Route::resource('areas', 'AreaController');
    Route::resource('usuarios', 'UsuarioController');
    // ... more stuff
});
filters.php(csrf过滤器部分):


这对我来说是个好办法。

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

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

注意:“post”是HTTP post动词,因此它将涵盖Laravel post、put、delete请求等。这是最好、最简单的解决方案:

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

无需对路由进行分组或干扰构造函数。

只需将其添加到
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请求中。

查看文档:您会在页面中间找到您的anwser:)FWIW,因为这仍然在Google的首页上,最新版本的安全文档是:值得添加的是,您需要添加
父项:\uu construct()发送给您的控制器。实际上,如果没有
parent::u construct(),它对我来说绝对有效。添加它会导致出现
Symfony\Component\Debug\Exception\FatalErrorException:无法调用构造函数。无需在Laravel 4.2I中添加
parent::_construct()
,我喜欢后一个过滤器选项-但请注意,您的过滤器称为crsf而不是csrf@
app/routes.php