2008-11-27 11 views
21

Chcę wykonać skrypt php z php, który będzie używać różnych stałych i różnych wersji klas, które są już zdefiniowane.Czy istnieje sposób na wykonanie kodu php w piaskownicy z poziomu php

Czy istnieje php_module piaskownicy gdzie mogę po prostu:

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

zamiast

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

Albo jest proc_open() jedyna opcja?

PS: Skrypt nie jest dostępny przez Internet, więc fopen ('http://host/script.php') nie jest opcją.

Odpowiedz

10

Istnieje runkit, ale może się okazać prostsze wywołanie skryptu za pomocą wiersza poleceń (Użyj shell_exec), jeśli nie potrzebujesz żadnej interakcji między procesami głównym i potomnym.

+2

O runkicie; nie wygląda na to, że piaskownica wygląda dobrze według opisu, a może powinienem powiedzieć, że jest to łatwe. Możesz zabronić używania funkcji, ale wolałabym zabronić WSZYSTKICH, oprócz tych, które znajdują się na podanej liście. Jeśli użytkownik potrzebuje funkcji, mogę ocenić jego bezpieczeństwo ręcznie na żądanie. Wygląda na to, że jedynym sposobem jest napisanie własnego interpretatora. Jeśli prędkość jest problemem, możesz przekonwertować jej AST na PHP lub inny język, to jest to, co teraz zrobię, ponieważ nie mogłem znaleźć gotowego rozwiązania. Pozdrawiam! Ps. Tak, widziałem, że ten Q jest stary. Ds. – Frank

+0

Cóż .. Powodzenia ze znalezieniem czegoś, co może sparsować PHP na AST;) Zgadzam się jednak z twoim punktem. – troelskn

+0

Runkit FYI wydaje się być porzucony i prawdopodobnie będziesz chciał skompilować wersję CVS lub jedną z poprawionych wersji (http://github.com/tricky/runkit), jeśli chcesz uruchomić ją na nowoczesnej wersji PHP – Eli

2

Ponadto, należy spojrzeć na backtick operator:

$sOutput = `php script_to_run.php`; 

To pozwoli Ci sprawdzić wyjście ze skryptu używasz. Należy jednak pamiętać, że skrypt będzie działał z posiadanymi uprawnieniami, ale można to obejść, używając sudo w systemie Linux.

Podejście to zakłada również, że zainstalowano PHP CLI, co nie zawsze ma miejsce.

1

Jest Runkit_Sandbox - może zmusić go do pracy, to rozszerzenie PHP. Powiedziałbym, że mam iść.

Ale może być konieczne utworzenie własnej "piaskownicy", np. poprzez resetowanie stanu zmiennych globalnych używanych superglobali.

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

    } 
} 

Zastosowanie:

$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

wiem, to nie jest 100% tematem związane, ale może być przydatna dla kogoś 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

to nie działa, jeśli plik $ __ próbuje zdefiniować już zdefiniowane stałe. może również łamać zmienne globalne, jeśli plik $ __ wykorzystuje globalne słowo kluczowe lub tablicę $ GLOBALS do odwoływania się do zmiennych w zakresie globalnym. – DrLightman

+0

zaktualizowałem kod, spróbuj teraz: D, jest dla mnie użyteczny: D może nie być doskonały, ale jest przydatny dla mnie, aby wymagać plików php, które tworzą vary podczas ich wykonywania, których nie chcę mieć w zasięgu globalnym: D – AgelessEssence

1

I opracowali BSD-licencjonowany klasę sandbox za to bardzo cel, powód. Wykorzystuje bibliotekę PHPParser do analizy piaskownicowanego kodu, sprawdzania go przed białymi listami i czarnymi listami konfigurowanymi przez użytkownika oraz oferuje szeroki wachlarz opcji konfiguracyjnych wraz z rozsądnymi domyślnymi ustawieniami. Dla twoich potrzeb możesz łatwo zdefiniować klasy o nazwie w swoim piaskownicym kodzie i skierować je do różnych.

Projekt zawiera również zestaw narzędzi do piaskownicy (używaj tylko na komputerze lokalnym!), Który może być używany do eksperymentowania z ustawieniami obszaru piaskownicy oraz pełna dokumentacja ręczna i API.

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

+0

Czy mimo to używasz swojej klasy bez instalowania jej przez kompozytora? Nie chcę instalować go na serwerze na żywo. Po prostu używając prostych klas? –

1

dynamiczny plugin, który umożliwia wykonanie funkcji plik załadowany i działać, aby wykonać coś, czego chce, ale może tylko wziąć i powrócić zmienne, które można 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); 
} 

kod zewnętrzna jest całkowicie piaskownicy i można stosować żadnych ograniczeń uprawnień chcesz wykonując sudo -u restricedUser php -r ....

Powiązane problemy