Manuel PHP
Précédent |  | Suivant

# Runkit_Sandbox

(no version information, might be only in CVS)

Runkit_Sandbox -- Classe Runkit Sandbox -- Machine Virtuelle PHP

## Description

L'instanciation de la classe Runkit_Sandbox crée un nouveau thread avec sa propre portée et sa pile de programme. En utilisant les options passées au constructeur, cet environnement peut être restreint à un sous-ensemble pour lequel l'interpréteur primaire peut exécuter et fournir un environnement plus sûr pour l'exécution de code utilisateur.

> Note : Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.

## Constructeur

void Runkit_Sandbox::__construct ( [array options] )

`options` est un tableau associatif contenant n'importe quelle combinaison des options ini listées ci-dessous.

`safe_mode`

  Si un script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec `safe_mode = off`, alors safe_mod devrait être activé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour désactiver `safe_mode` lorsque safe_mode est déjà activé dans le script extérieur.

`safe_mode_gid`

  Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec `safe_mode_gid = on`, alors safe_mod_gid devrait être désactivé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour activer `safe_mode_gid` lorsque c'est déjà désactivé dans le script extérieur.

`safe_mode_include_dir`

  Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec `safe_mode_include_dir`, alors un nouveau safe_mode_include_dir devrait être fixé pour les environnements de sandbox sous la valeur actuellement définie. safe_mode_include_dir peut aussi être supprimé pour indiquer que l'évitement de cette fonctionnalité est désactivé. Si safe_mode_include_dir était vide dans le script extérieur, mais safe_mod n'était pas activé, alors n'importe quel safe_mode_include_dir arbitraire peut être fixé en activant le safe_mode.

`open_basedir`

  `open_basedir` peut être fixé à n'importe quel chemin sous la configuration courante de `open_basedir`. Si open_basedir n'est pas fixé dans la portée globale, alors il est assumé qu'il est dans le répertoire root et peut être fixé à n'importe quelle autre emplacement.

`allow_url_fopen`

  Comme `safe_mode`, cette configuration peut seulement être faite plus restrictive, dans ce cas, en mettant `FALSE` lorsque la valeur était précédemment `TRUE`.

`disable_functions`

  Liste de fonctions séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des fonctions déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.

`disable_classes`

  Liste de classes séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des classes déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.

`runkit.superglobal`

  Liste des variables qui seront traitées en tant que superglobales dans le sous-interpréteur sandbox. Ces variables seront utilisées en plus de celles définies à l'interne ou à l'aide de la configuration runkit.superglobal.

`runkit.internal_override`

  L'option ini `runkit.internal_override` devrait être désactivée (mais non réactivée) à l'intérieur des sandbox.

Exemple 1. Instanciation d'un sandbox restreint

`<?php $options = 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($options); /* Configurations ini non protégées sont fixées normalement */ $sandbox->ini_set('html_errors',true); ?>`

## Appel de Fonctions PHP

Toutes les variables dans la portée globale de l'environnement sandbox sont accessibles comme étant des propriétés de l'objet sandbox. La première chose à noter, c'est puisque la manière de gestion de la mémoire entre les deux threads est faite que les objets et les variables de ressources ne peuvent pas, jusqu'à présent, être échangées entre les interpréteurs. De plus, tous les tableaux sont copiés au complet et toutes références seront perdues. Cela veut aussi dire que les références entre les interpréteurs ne sont pas possibles.

Exemple 2. Utilisation des variables dans 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));'); ?>`

L'exemple ci-dessus va afficher :

    bar
    barbaz
    bool(false)

## Appel de Fonctions PHP

Toute fonction définie dans le sandbox peut être appelée en tant que méthode sur l'objet sandbox. Ceci inclut aussi quelques constructions de pseudo-fonctions : eval() include(), include_once(), require(), require_once(), echo(), print(), die() et exit().

Exemple 3. Appel de fonctions sandbox

`<?php $sandbox = new Runkit_Sandbox(); echo $sandbox->str_replace('a','f','abc'); ?>`

L'exemple ci-dessus va afficher :

    fbc

Lors du passage d'arguments à une fonction sandbox, les arguments sont pris à partir de l'extérieur de l'instance de PHP. Si vous voulez passer les arguments à la portée de sandbox, soyez assuré de les accéder comme étant des propriétés de l'objet sandbox comme montré plus haut.

Exemple 4. Passage d'arguments aux fonctions sandbox

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

L'exemple ci-dessus va afficher :

    bar
    baz

## Modification des Configurations de Sandbox

Depuis la version de runkit 0.5, certaines configurations de Sandbox peuvent être modifiées à la volée en utilisant la syntaxe ArrayAccess. Certaines configurations, comme `active` sont en lecture seule et permettent de fournir des informations de statut. Les autres configurations, comme `output_handler` peuvent être fixées et lues comme un tableau normal. Les configurations futures devraient être en écriture seule, cependant aucune configuration n'existe présentement.

Tableau 1. Configurations Sandbox / Indicateurs de Statut

Configuration | Type | But | Défaut
--- | --- | --- | ---
`active` | booléen (Lecture Seule) | `TRUE` si le Sandbox est toujours dans un état utilisable, `FALSE` si la requête est en arrêt dû à un appel à die(), exit() ou à cause d'une condition d'erreur fatale. | `TRUE` (Initial)
`output_handler` | Callback | Lorsque fixée à une valeur de retour valide, toutes sorties générées par l'instance Sandbox seront traitées à travers la fonction nommée. Les sorties de Sandbox suivent les mêmes conventions d'appel pour les gestionnaires de sortie du système entier. | Aucun
`parent_access` | booléen | Autorise sandbox à utiliser des instances de la classe Runkit_Sandbox_Parent. Doit être activée pour que les autres configurations reliées à Runkit_Sandbox_Parent fonctionnent. | `FALSE`
`parent_read` | booléen | Autorise sandbox à lire des variables dans son contexte parent. | `FALSE`
`parent_write` | booléen | Autorise sandbox à modifier des variables dans son contexte parent. | `FALSE`
`parent_eval` | booléen | Autorise sandbox à évaluer du code arbitraire dans son contexte parent. (DANGEREUX) | `FALSE`
`parent_include` | booléen | Autorise sandbox à inclure des fichiers de code php dans son contexte parent. DANGEREUX | `FALSE`
`parent_echo` | booléen | Autorise sandbox à afficher des données dans son contexte parent en court-circuitant efficacement son propre output_handler. | `FALSE`
`parent_call` | booléen | Autorise sandbox à appeler des fonctions dans son contexte parent. | `FALSE`
`parent_die` | booléen | Autorise sandbox à tuer son propre parent. (Et donc soi-même) | `FALSE`
`parent_scope` | entier | Quelle portée la propriété de l'accès parental vérifiera ? 0 == Portée Globale, 1 == Portée Appelante, 2 == Portée précédant la portée appelante, 3 == La porté avant celle-ci, etc., etc. | `0` (Global)

`parent_scope`

chaîne de caractères

Lorsque `parent_scope` est fixée à une valeur d'une chaîne de caractères, elle se réfère à une variable tableau nommée dans la portée globale. Si la variable nommée n'existe pas au moment de son accès, elle sera créée comme un tableau vide. Si la variable existe mais n'est pas un tableau, un faux tableau sera créé contenant une référence à la variable globale nommée.

Précédent | Sommaire | Suivant
Fonctions runkit | Niveau supérieur | Runkit_Sandbox_Parent