调用控制台命令安全性:从控制器操作检查产生锁定文件未找到响应

时间:2016-10-03 21:24:13

标签: php cron symfony

(Symfony3)

我想要设置一些简单的cron任务来为我们的项目经理生成安全报告,以便他们可以为开发人员安排升级时间(而不是我忘记手动运行)。

作为一个非常基本的检查,我只是运行......

php bin/console security:check

...看看作曲家对漏洞的看法。最后,我希望将此输出转换为电子邮件,或者在运行cron时将其发布到松散频道或大写字母作业。

问题

当我从via终端运行命令时,它运行良好。在控制器内运行命令始终返回响应锁定文件不存在。我假设这是参考项目根目录下的composer.lock文件。我可以确认这个文件确实存在。

以下是我目前使用的控制器,改编自:

http://symfony.com/doc/current/console/command_in_controller.html

<?php

namespace Treetop1500\SecurityReportBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

class DefaultController extends Controller
{
    public function indexAction($key)
    {

        if ($key != $this->getParameter('easy_cron_key')) {
            throw new UnauthorizedHttpException("You are not authorized to access this page.");
        }

        $kernel = $this->get('kernel');
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput(array(
          'command' => 'security:check'
        ));

        // You can use NullOutput() if you don't need the output
        $output = new BufferedOutput();
        $application->run($input, $output);

        // return the output, don't use if you used NullOutput()
        $content = $output->fetch();

        // return new Response(""), if you used NullOutput()
        return new Response($content);

    }
}

$content始终具有值&#34;锁定文件不存在。&#34;

我意识到可能有更好的工具和方法来做到这一点,但是我真的想了解为什么这是来自此控制器操作的生成响应。谢谢你看看!

2 个答案:

答案 0 :(得分:1)

将绝对路径传递给composer.lock文件就像那样:

php bin/console security:check /path/to/another/composer.lock

所以在你的例子中,那将是:

$input = new ArrayInput([
    'command'  => 'security:check',
    'lockfile' => '/path/to/another/composer.lock'
]);

阅读更多信息:来自SensioLabs的SecurityCheckerCommand。可选参数为lockfile,由SecurityChecker检查。在第46行,他们正在查找composer.lock文件(默认参数)并在找不到它们时抛出异常。

P.S。之前,我为数组输入了错误的参数。我查看了Symfony文档(How to Call Other Commands)并修复了答案。

答案 1 :(得分:0)

解决方法是将lockfile参数传递给ArrayInput对象,如下所示:

$lockfile = $this->get('kernel')->getRootDir()."/../composer.lock";
$input = new ArrayInput(array('command'=>'security:check','lockfile'=>$lockfile));