#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));
Я не знаю, насколько хороша эта идея, но…