Динамический скрипт PHP exec узла из памяти

#php #node.js

#php #node.js

Вопрос:

Я пытаюсь запустить код через Node.js из PHP, не касаясь файловой системы (диска). Возможно ли это?

Что я делаю

 <?php

function renderJs($script) {
  $path = __DIR__.'/'.md5($script).'.js';
  file_put_contents($path, $script);
  $rendered = `node $path`;
  unlink($path);

  return $rendered;
}

$val = renderJs('console.log(1 1)'); // 2
  

Чего бы я хотел избежать

  • Необходимость сохранения файла на диск
  • Установка дополнительных расширений PHP (например, V8js)

В идеале это было бы что-то вроде

 $magicBlob = php_magic($script);
$rendered = `node $magicBlob`;
  

Я не могу просто оценить его, как в

 $rendered = `node --eval "$script"`;
  

потому что в скрипте могут быть кавычки, которые нарушат мое внешнее цитирование.

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

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

Ответ №1:

использование escapeshellarg работает для меня:

 $js = <<<EOF

hello = function (name) {
    console.log('`Hello there ' name "!!`");
}

hello('PHP');
EOF;

$rendered = system("node --eval ".escapeshellarg($js));
  

Я не знаю, насколько хороша эта идея, но…