2008-11-27 6 views
21

Je veux exécuter un script php à partir de php qui utilisera différentes constantes et différentes versions de classes déjà définies.Existe-t-il un moyen d'exécuter du code php dans un sandbox à partir de php?

Yat-il un php_module bac à sable où je pouvais:

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

au lieu de

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

Ou est proc_open() la seule option? PS: Le script n'est pas accessible via le Web, donc fopen ('http://host/script.php') n'est pas une option.

Répondre

10

Il existe runkit, mais vous trouverez peut-être plus simple d'appeler le script via la ligne de commande (utilisez shell_exec) si vous n'avez besoin d'aucune interaction entre les processus maître et enfant.

+2

À propos de runkit; il ne semble pas bien bac à sable par description, ou je devrais peut-être dire facile. Vous pouvez interdire des fonctions, mais je voudrais plutôt interdire TOUS sauf ceux dans une liste fournie. Si un utilisateur a besoin d'une fonction, je peux évaluer sa sécurité à la main sur demande. Il semble que le seul moyen est d'écrire un interpréteur personnalisé. Si la vitesse est un problème, vous pouvez le faire convertir son AST en PHP ou dans une autre langue, c'est en fait ce que je vais faire maintenant que je ne pouvais pas trouver une solution prête. À la votre! Ps. Oui, j'ai vu que ce Q est vieux. Ds. – Frank

+0

Eh bien .. Bonne chance de trouver quelque chose qui peut analyser PHP dans un AST;) Je suis d'accord avec votre point cependant. – troelskn

+0

FYI runkit semble être abandonné et vous aurez probablement envie de compiler soit la version CVS ou l'une des versions corrigées (http://github.com/tricky/runkit) si vous voulez l'exécuter sur une version moderne de PHP – Eli

2

En outre, vous devriez regarder le backtick operator:

$sOutput = `php script_to_run.php`; 

Cela vous permettra d'inspecter la sortie du script que vous utilisez. Cependant, notez que le script sera exécuté avec les privilèges dont vous disposez, mais vous pouvez le contourner en utilisant sudo sur Linux. Cette approche suppose également que PHP CLI est installé, ce qui n'est pas toujours le cas.

1

Il est Runkit_Sandbox - vous pourriez le faire fonctionner, il est une extension PHP. Je dirais le chemin à parcourir. Mais vous devrez peut-être créer un "bac à sable", par exemple. en réinitialisant l'état de variable globale des superglobaux que vous utilisez.

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; 
     } 

    } 
} 

Utilisation:

$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(); 
0

Je sais que ce ne est pas 100% Sujet connexe, mais peut-être utile pour quelqu'un 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; 

}; 
+0

cela ne fonctionne pas si $ __ file essaie de définir des constantes déjà définies. il peut aussi casser des variables globales si le fichier $ ___ utilise le mot clé global ou le tableau $ GLOBALS pour référencer des variables dans la portée globale. – DrLightman

+0

j'ai mis à jour le code, essayez-le maintenant: D, il est utile pour moi: D peut-être pas parfait, mais il est utile pour moi d'exiger des fichiers php qui créent des vars pendant leur exécution. – AgelessEssence

1

J'ai développé une classe de bac à sable sous licence BSD pour cette objectif. Il utilise la bibliothèque PHPParser pour analyser le code en sandbox, le vérifier par rapport à des listes blanches et des listes noires configurables par l'utilisateur, et dispose d'un large éventail d'options de configuration ainsi que de paramètres par défaut sains. Pour vos besoins, vous pouvez facilement redéfinir les classes appelées dans votre code sandbox et les acheminer vers des classes différentes.

Le projet comprend également une boîte à outils sandbox (à utiliser uniquement sur votre machine locale!) Qui peut être utilisée pour tester les paramètres du sandbox, ainsi qu'une documentation complète sur le manuel et l'API.

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

+0

Est-il possible d'utiliser votre classe sans l'installer via composer? Je ne veux pas l'installer sur le serveur live. Juste en utilisant les classes ordinaires? –

1

exécution de la fonction de plug-in dynamique qui permet au fichier chargé et la fonction à exécuter tout ce qu'il veut, mais il ne peut prendre et renvoyer les variables qui peuvent être json_encode « ed.

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); 
} 

le code externe est totalement sandbox et vous pouvez appliquer toutes les autorisations restrictions que vous souhaitez en faire sudo -u restricedUser php -r ....

Questions connexes