Runkit_Sandbox

(PECL runkit >= 0.7.0)

Runkit_Sandbox La Clase Runkit Sandbox -- Máquina Virtual de PHP

Descripción

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.

Constructor

Runkit_Sandbox::__construct ([ array $options ] ) : void

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

Acceder a Variables

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)

Llamar a Funciones de PHP

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

Cambiar la Configuración del Aislamiento de Procesos

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 del Aislamiento de Procesos / Indicadores de estado
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.