繁体   English   中英

所有POST请求上的Laravel 4 CSRF

[英]Laravel 4 CSRF on all POST requests

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

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

如何在CSRF过滤器中使用它? 一直在尝试一些不同的东西

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

但我可能会离开这里..这将如何运作? 或者甚至可以这样做?

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

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

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

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

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中我有这个:

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

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

出于某种原因推杆

$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;
        }
    }
});

这对我有用。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM