Есть ли способ выполнить php-код в песочнице из php

Я хочу выполнить php-скрипт из php, который будет использовать разные константы и разные версии уже определенных классов.

Есть ли песочница php_module, в которой я мог бы просто:

sandbox('script.php'); // run in a new php environment

вместо

include('script.php'); // run in the same environment

Или proc_open () - единственный вариант?

PS: скрипт недоступен через Интернет, поэтому fopen ('http://host/script.php ') не вариант.


person Bob Fanger    schedule 27.11.2008    source источник


Ответы (7)


Существует runkit, но вам может быть проще просто вызвать сценарий из командной строки (используйте shell_exec), если вам не нужно никакого взаимодействия между главным и дочерним процессами.

person troelskn    schedule 27.11.2008
comment
О ранките; это не похоже на песочницу по описанию, или, может быть, я должен сказать легко. Вы можете запретить функции, но я бы предпочел запретить ВСЕ, кроме тех, которые указаны в предоставленном списке. Если пользователю нужна функция, я могу вручную оценить ее безопасность по запросу. Похоже, единственный способ - написать интерпретатор на заказ. Если скорость является проблемой, вы можете заставить его преобразовать свой AST в PHP или другой язык, на самом деле это то, что я собираюсь сделать сейчас, так как я не мог найти готового решения. Ваше здоровье! Пс. Да, видел, что этот Q старый. Ds. - person Frank; 14.06.2010
comment
Что ж ... Удачи в поисках чего-то, что может преобразовать PHP в AST;) Однако я согласен с вашей точкой зрения. - person troelskn; 14.06.2010
comment
FYI runkit, похоже, заброшен, и вы, вероятно, захотите скомпилировать либо версию CVS, либо одну из исправленных версий (github .com / tricky / runkit), если вы хотите запустить его на современной версии PHP. - person Eli; 21.07.2010

Это класс на GitHub, который может помочь на ранних этапах, но выглядит многообещающим.

https://github.com/fregster/PHPSandbox

person Paul    schedule 02.07.2011

Также обратите внимание на оператор обратного апострофа:

$sOutput = `php script_to_run.php`;

Это позволит вам проверить вывод выполняемого скрипта. Однако обратите внимание, что сценарий будет запускаться с имеющимися у вас привилегиями, но вы можете обойти это, используя sudo в Linux.

Этот подход также предполагает, что у вас установлен PHP CLI, что не всегда так.

person Vegard Larsen    schedule 28.11.2008

Есть Runkit_Sandbox - вы можете заставить его работать, это расширение PHP . Я бы сказал, как идти.

Но вам может потребоваться создать собственную «песочницу», например путем сброса состояния глобальной переменной суперглобальных переменных, которые вы используете.

class SandboxState
{
    private $members = array('_GET', '_POST');
    private $store = array();
    public function save() {
        foreach($members as $name) {
            $this->store[$name] = $$name;
            $$name = NULL;
        }
    }
    public function restore() {
        foreach($members as $name) {
            $$name = $this->store[$name];
            $this->store[$name] = NULL;
        }

    }
}

Использование:

$state = new SanddboxState();
$state->save();

// compile your get/post request by setting the superglobals
$_POST['submit'] = 'submit';
...

// execute your script:
$exec = function() {
    include(func_get_arg(0)));
};
$exec('script.php');

// check the outcome.
...

// restore your own global state:
$state->restore();
person hakre    schedule 17.04.2012

Именно для этой цели я разработал класс песочницы с лицензией BSD. Он использует библиотеку PHPParser для анализа изолированного кода, проверки его на соответствие настраиваемым пользователем белым и черным спискам, а также предлагает широкий спектр параметров конфигурации наряду с разумными настройками по умолчанию. Для ваших нужд вы можете легко переопределить классы, вызываемые в вашем изолированном коде, и направить их к другим.

Проект также включает набор инструментов песочницы (используйте только на вашем локальном компьютере!), Который можно использовать для экспериментов с настройками песочницы, а также полное руководство и документацию по API.

https://github.com/fieryprophet/php-sandbox

person Elijah Horton    schedule 04.03.2013
comment
Есть ли способ использовать ваш класс, не устанавливая его через композитор. Я не хочу устанавливать его на рабочий сервер. Просто используя простые классы? - person Obaid Maroof; 07.10.2013

выполнение динамической функции плагина, которая позволяет загруженному файлу и функции выполнять все, что угодно, однако может принимать и возвращать только переменные, которые могут быть json_encodeed.

function proxyExternalFunction($fileName, $functionName, $args, $setupStatements = '') {
  $output = array();
  $command = $setupStatements.";include('".addslashes($fileName)."');echo json_encode(".$functionName."(";
  foreach ($args as $arg) {
    $command .= "json_decode('".json_encode($arg)."',true),";
  }
  if (count($args) > 0) {
    $command[strlen($command)-1] = ")";//end of $functionName
  }
  $command .= ");";//end of json_encode
  $command = "php -r ".escapeshellarg($command);

  exec($command, $output);
  $output = json_decode($output,true);
}

внешний код полностью изолирован, и вы можете применить любые ограничения разрешений, которые захотите, выполнив sudo -u restricedUser php -r ....

person user3338098    schedule 09.09.2015

Я знаю, что это не на 100% связано с темой, но, может быть, полезно для кого-то н_н

function require_sandbox($__file,$__params=null,$__output=true) {

    /* original from http://stackoverflow.com/a/3850454/209797 */

    if($__params and is_array($__params))
     extract($__params);

    ob_start();
    $__returned=require $__file;
    $__contents=ob_get_contents();
    ob_end_clean();

    if($__output)
     echo $__contents;
    else
     return $__returned;

};
person AgelessEssence    schedule 12.01.2013
comment
он не работает, если $ __ file пытается определить уже определенные константы. он также может нарушить глобальные переменные, если $ __ file использует ключевое слово global или массив $ GLOBALS для ссылки на переменные в глобальной области. - person DrLightman; 11.04.2014
comment
Я обновил код, попробуйте сейчас: D, это полезно для меня: D может быть не идеальным, но мне полезно потребовать некоторые файлы php, которые создают вары во время их выполнения, которые я не хочу, чтобы они были в глобальной области: D - person AgelessEssence; 11.04.2014
comment
Это больше похоже на template_require, а не на песочницу - person Tofandel; 07.04.2021