(PECL runkit >= 0.7.0)
Runkit_Sandbox — La Clase Runkit Sandbox -- Máquina Virtual de PHP
Al instanciar la clase Runkit_Sandbox se crea un nuevo hilo con su própio ámbito y pila de programa. Al usar un conjunto de opciones pasadas al constructor, este entorno puede estar restringido a un subconjunto de lo que el intérprete primario puede hacer y proporciona un entorno seguro para ejecutar código proporcionado por el usuario.
Nota: Soporte para Entorno de Pruebas (requerido por runkit_lint(), runkit_lint_file(), y la clase Runkit_Sandbox) está disponible sólo a partir de PHP 5.1.0 o versiones especialmente parcheadas de PHP 5.0, y requiere que thread safety sea habilitada. Vea el archivo README incluido en el paquete runkit para más información.
$options
] )
options
es un array asociativo que contiene
cualquier combinación de las opciones especiales ini listadas abajo.
safe_mode
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con safe_mode = off, safe_mode puede ser activado para el entorno del aislamiento de procesos (sandbox). Esta configuración no se puede usar para deshabilitar safe_mode cuando ya está habilitado en el script exterior.
safe_mode_gid
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con safe_mode_gid = on, safe_mode_gid puede ser activado para el entorno del aislamiento de procesos. Esta configuración no se puede usar para habilitar safe_mode_gid cuando ya está deshabilitado en el script exterior.
safe_mode_include_dir
Si el script exterior que está instanciando la clase Runkit_Sandbox se configura con un directorio safe_mode_include_dir, un nuevo directorio safe_mode_include_dir puede ser establecido para los entornos del aislamiento de procesos bajo es valor definido actualmente. safe_mode_include_dir también puede ser limpiado para indicar que la característica de bypass está deshabilitada. Si safe_mode_include_dir estaba en blanco en el script exterior, pero safe_mode no estaba habilitado, se puede establecer cualquier directorio safe_mode_include_dir arbitrario mientras se activa safe_mode.
open_basedir
open_basedir
puede ser establecido a cualquier ruta bajo la
confuguración actual de open_basedir. Si
open_basedir no está establecido dentro del ámbito global,
se asume que es el directorio raíz y puede ser establecido a cualquier ubicación.
allow_url_fopen
Como safe_mode
, esta configuración sólo puede ser hecha más restrictiva,
en este caso estableciéndola a FALSE
cuando estaba anteriomente establecida a TRUE
disable_functions
Una lista de funciones separadas por comas a deshabilitar dentro del sub-intérprete del aisalmiaento de procesos. Esta lista no necesita contener los nombres de las funciones actualmente deshabiltadas, permanecerán deshabiltadas ya estén listadas o no.
disable_classes
Una lista de clases separadas por comas a deshabilitar dentro del sub-intérprete del aisalmiaento de procesos. Esta lista no necesita contener los nombres de las clases actualmente deshabiltadas, permanecerán deshabiltadas ya estén listadas o no.
runkit.superglobal
Una lista de varables separadas por comas a ser tratadas como superglobales dentro del sub-intérprete del aislamiaento de procesos. Estas variables serás usadas además de cualquier variable definida internamente o a través de la configuración global runkit.superglobal.
runkit.internal_override
La opción ini runkit.internal_override puede ser deshabilitada (pero no rehabilitada) dentro de los aislamientos de procesos.
Ejemplo #1 Instanciar un entorno de aislamiento de procesos (sandbox) restringido
<?php
$opciones = array(
'safe_mode'=>true,
'open_basedir'=>'/var/www/users/jdoe/',
'allow_url_fopen'=>'false',
'disable_functions'=>'exec,shell_exec,passthru,system',
'disable_classes'=>'myAppClass');
$sandbox = new Runkit_Sandbox($opciones);
/* Las configuraciones ini no protegidas pueden establecerse normalmente */
$sandbox->ini_set('html_errors',true);
?>
Todas las variables en el ámbito global del entorno del aislamiento de procesos son accesibles como propiedades del objeto de aislamiento de procesos. Lo primero a tener en cuenta es que a causa de la manera en que se maneja la memoria entre estos dos hilos, las variables de objeto y de recurso actualmente no se pueden intercambiar entre intérpretes. Además, todas las matrices se copian en profundidad y cualquier referencia se perderá. Esto también siginifiva que las referencias entre intérpretes no son posibles.
Ejemplo #2 Trabajar con variables en un entorno de aislamiento de procesos (sandbox)
<?php
$sandbox = new Runkit_Sandbox();
$sandbox->foo = 'bar';
$sandbox->eval('echo "$foo\n"; $bar = $foo . "baz";');
echo "{$sandbox->bar}\n";
if (isset($sandbox->foo)) unset($sandbox->foo);
$sandbox->eval('var_dump(isset($foo));');
?>
El resultado del ejemplo sería:
bar barbaz bool(false)
Cualquier función definida dentro del entorno de aislamiento de procesos puede ser llamada como un método del objeto de aislamiento de procesos. Esto también incluye algunos contructores de lenguaje de pseudo-función: eval(), include, include_once, require, require_once, echo, print, die(), y exit().
Ejemplo #3 Llamar a funciones del aislamiento de procesos
<?php
$sandbox = new Runkit_Sandbox();
echo $sandbox->str_replace('a','f','abc');
?>
El resultado del ejemplo sería:
fbc
Cuando se pasan argumentos a una función de aislameinto de procesos, los argumentos se toman desde la instancia exterior de PHP. Si se desea pasar argumentos desde el ámbito del aislamiento de procesos, asegúrese de acceder a ellos como propiedades del objeto de aislamiento de procesos como se ilustra abajo.
Ejemplo #4 Pasar agumentos a las funciones del aislamiento de procesos
<?php
$sandbox = new Runkit_Sandbox();
$foo = 'bar';
$sandbox->foo = 'baz';
echo $sandbox->str_replace('a',$foo,'a');
echo $sandbox->str_replace('a',$sandbox->foo,'a');
?>
El resultado del ejemplo sería:
bar baz
A partir de la versión 0.5 de runkit, se pueden modificar ciertas configuraciones
del aislamiento de procesos sobre la marcha usando la sintaxis de ArrayAccess.
Algunos ajustes, como active
,
son de sólo lectura y proporcionan información de estado.
Otros ajustes, como output_handler
,
se pueden establecer y leer como un índice de matriz normal.
Ajustes futuros puede ser de sólo escritura, sin embargo
actualmente no existen tales ajustes.
Configuración | Tipo | Propósito | Predeterminado |
---|---|---|---|
active | Boolean (Sólo Lectura) |
TRUE si el Aislamiento de Procesos está aún en un estado usable,
FALSE si la peticióni está abandonada debido a una
llamada a die(), exit(), o a causa de una condición
de error fatal.
|
TRUE (Inicial) |
output_handler | Callback | Cuando se establece a una llamada de retorno válida, toda la salida generada por la instancia del Aislamiento de Procesos será procesada por la función nominada. Los gestores de salida del Aislamiento de Procesos siguen las misma convenciones de llamada que los gestores de salida del lado del sistema. | Ninguno |
parent_access | Boolean | ¿El aislamiento de procesos puede usar instancias de la clase Runkit_Sandbox_Parent? Debe estar habilitado para otras configuraciones de Runkit_Sandbox_Parent relacionadas para que funcione. | FALSE |
parent_read | Boolean | ¿El aislamiento de procesos puede leer variables en su contexto padre? | FALSE |
parent_write | Boolean | ¿El aislamiento de procesos puede modificar variables en su contexto padre? | FALSE |
parent_eval | Boolean | ¿El aislamiento de procesos puede evaluar código arbitrario en su contexto padre? PELIGROSO | FALSE |
parent_include | Boolean | ¿El aislamiento de procesos puede incluir archivos de código php en su contexto padre? PELIGROSO | FALSE |
parent_echo | Boolean | ¿El aislamiento de procesos puede hacer eco de información en su contexto padre eefctivamente pasando su propio output_handler? | FALSE |
parent_call | Boolean | ¿El aislamiento de procesos puede llamar a funciones en su contexto padre? | FALSE |
parent_die | Boolean | ¿El aislamiento de procesos puede eliminar su propio contexto padre? (Y así a sí mismo) | FALSE |
parent_scope | Integer | ¿Qué Ámbito tendrá el acceso de las propiedades padre? 0 == Ámbito global, 1 == Ámbito de llamda, 2 == Ámbito precediendo al ambito de llamada, 3 == El ambito antes de este, etc..., etc... | 0 (Global) |
parent_scope | String | Cuando parent_scope está establecido a un valor de cadena, se refiere a un variable de matriz nominada en el Ámbito global. Si la variable nominada no existe el momento del acceso se creará como un array vacío. Si la varible existe pero no es un array, se creará un array "falso" que contiene una referencia a la variable global nominada. |