22

既に定義されているさまざまな定数とさまざまなバージョンのクラスを使用する php スクリプトを php から実行したいと考えています。

私ができるサンドボックスphp_moduleはありますか:

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

それ以外の

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

または、proc_open()が唯一のオプションですか?

PS: スクリプトは Web からアクセスできないため、fopen(' http://host/script.php ') はオプションではありません。

4

7 に答える 7

10

runkitがありますが、マスター プロセスと子プロセスの間で対話が必要ない場合は、コマンド ラインでスクリプトを呼び出す方が簡単な場合があります ( shell_execを使用します)。

于 2008-11-27T22:23:14.850 に答える
6

これは GitHub のクラスで、初期段階では役立つ可能性がありますが、有望に見えます。

https://github.com/fregster/PHPSandbox

于 2011-07-02T10:35:36.760 に答える
2

また、バックティック演算子を確認する必要があります。

$sOutput = `php script_to_run.php`;

これにより、実行中のスクリプトからの出力を調べることができます。ただし、スクリプトは自分が持っている権限で実行されますが、Linux で sudo を使用することでこれを回避できることに注意してください。

このアプローチでは、PHP CLI がインストールされていることも前提としていますが、常にそうであるとは限りません。

于 2008-11-28T11:04:23.893 に答える
2

あります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();
于 2012-04-17T10:03:48.060 に答える
1

私はまさにこの目的のためにBSDライセンスのサンドボックスクラスを開発しました。PHPParserライブラリを利用してサンドボックス化されたコードを分析し、ユーザーが構成可能なホワイトリストおよびブラックリストと照合し、さまざまな構成オプションと適切なデフォルト設定を備えています。ニーズに応じて、サンドボックス化されたコードで呼び出されたクラスを簡単に再定義し、それらを別のクラスにルーティングできます。

このプロジェクトには、サンドボックス設定の実験に使用できるサンドボックスツールキット(ローカルマシンでのみ使用できます!)、および完全なマニュアルとAPIドキュメントも含まれています。

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

于 2013-03-04T05:18:28.573 に答える
0

100% トピック関連ではないことはわかっていますが、誰かにとっては役立つかもしれません n__n

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;

};
于 2013-01-12T04:33:29.257 に答える