Php 所有POST请求上的Laravel 4 CSRF
最近一直在调查laravel,并试图找出他们拥有的CSRF保护。然而,我不能让它工作。是否有任何方法可以通过CSRF过滤器验证所有提交的post请求?我已经看到laravel系统有: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'); }); 但
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()如果您打算使用BaseController方法,请将代码>发送给您的控制器。实际上,如果没有parent::u construct(),它对我来说绝对有效代码>。添加它会导致出现Symfony\Component\Debug\Exception\FatalErrorException:无法调用构造函数。无需在Laravel 4.2I中添加parent::_construct()
,我喜欢后一个过滤器选项-但请注意,您的过滤器称为crsf而不是csrf@app/routes.php