Безопасность вызова консольной команды: проверка из действия контроллера выдает ответ «Файл блокировки не найден»

#php #cron #symfony

#php #cron #symfony

Вопрос:

(Symfony3)

Я играю с идеей настроить несколько простых задач cron для создания отчетов о безопасности для наших менеджеров проектов, чтобы они могли планировать время обновления для разработчиков (или я забываю запускать их вручную).).

В качестве очень простой проверки я просто выполню…

 php bin/console security:check
  

… чтобы узнать, что композитор может сказать об уязвимостях. В конечном итоге я хотел бы отправить этот вывод в электронное письмо или отправить его в задание slack channel или basecamp при запуске cron.

Проблема

Когда я запускаю команду с помощью терминала, она отлично работает. Выполнение команды внутри контроллера всегда возвращает ответ «Файл блокировки не существует«. Я предполагаю, что это относится к композитору.файл блокировки в корне проекта. Я могу подтвердить, что этот файл действительно существует.

Ниже приведен контроллер, который я использую в настоящее время, который адаптирован из этого:

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

 <?php

namespace Treetop1500SecurityReportBundleController;

use SymfonyBundleFrameworkBundleControllerController;
use SymfonyBundleFrameworkBundleConsoleApplication;
use SymfonyComponentConsoleInputArrayInput;
use SymfonyComponentConsoleOutputBufferedOutput;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionUnauthorizedHttpException;

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 всегда имеет значение «Файл блокировки не существует».

Я понимаю, что, вероятно, есть лучшие инструменты и способы сделать это, однако мне бы очень хотелось понять, почему это сгенерированный ответ из этого действия контроллера. Спасибо, что посмотрели!

Ответ №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'
]);
  

Подробнее: SecurityCheckerCommand от SensioLabs. Необязательный аргумент — это lockfile , который проверяется SecurityChecker . В строке 46 они ищут composer.lock файл (аргумент по умолчанию) и выдают исключение, когда они не найдены.

PS Ранее я вводил неправильные параметры в массив. Я проверил документацию Symfony (как вызывать другие команды) и исправил ответ.

Комментарии:

1. На самом деле это не работает и выдает ошибку [SymfonyComponentConsoleExceptionCommandNotFoundException] Command "security:check XXX/XXX/../composer.lock" is not defined. Did you mean one of these? security:check security:encode-password

2. Мой плохой, исправлен ответ.

Ответ №2:

Решение этой проблемы заключается в передаче аргумента lockfile объекту ArrayInput следующим образом:

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