在线文档教程
PHP
类和函数 | Classes and Functions

Runkit_Sandbox

Runkit_Sandbox

(PECL runkit >= 0.7.0)

Runkit_Sandbox - Runkit Sandbox类 - PHP虚拟机

描述

实例化Runkit_Sandbox类将创建一个具有自己的作用域和程序堆栈的新线程。使用传递给构造函数的一组选项,此环境可能被限制为主要解释器可以执行的一个子集,并为执行用户提供的代码提供更安全的环境。

注意:sandbox支持(runkit_lint(),runkit_lint_file()和Runkit_Sandbox类所需的)仅适用于PHP 5.1.0或专门修补的PHP 5.0版本,并且要求启用线程安全性。请参阅runkit软件包中包含的README文件以获取更多信息。

构造函数

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

options 是一个包含以下列出的特殊ini选项的任意组合的关联数组。

safe_mode

如果实例化Runkit_Sandbox类的外部脚本配置为safe_mode = off,则可以为沙箱环境启用safe_mode。当它已经在外部脚本中启用时,此设置不能用于禁用safe_mode

safe_mode_gid

如果实例化Runkit_Sandbox类的外部脚本配置了safe_mode_gid = on,则可以关闭沙箱环境的safe_mode_gid。如果safe_mode_gid在外部脚本中已被禁用,则无法使用此设置。

safe_mode_include_dir

如果实例化Runkit_Sandbox类的外部脚本配置了safe_mode_include_dir,则可以为当前定义的值以下的沙箱环境设置新的safe_mode_include_dirsafe_mode_include_dir也可以被清除以指示旁路功能被禁用。如果safe_mode_include_dir在外部脚本中为空,但safe_mode未启用,则可以在启用safe_mode时设置任意的safe_mode_include_dir

open_basedir

open_basedir可以设置为open_basedir当前设置下的任何路径。如果open_basedir没有在全局范围内设置,那么它被假定为根目录并且可以被设置为任何位置。

allow_url_fopen

就像safe_mode,这个设置只能做更多的限制,在这种情况下,通过将它设置FALSE为之前的设置TRUE

disable_functions

逗号分隔的功能列表在沙盒子解释器中禁用。该列表不需要包含当前禁用的功能的名称,无论是否在此处列出,它们都将保持禁用状态。

disable_classes

逗号分隔的类列表在沙盒子解释器中禁用。该列表不需要包含当前禁用的类的名称,无论是否在此列出,它们都将保持禁用状态。

runkit.superglobal

逗号分隔的变量列表在沙盒子解释器中被视为超全局变量。除了在内部或通过全局runkit.superglobal设置定义的变量外,还将使用这些变量。

runkit.internal_override

Ini选项runkit.internal_override可能被禁用(但不能重新启用)。

Example #1 Instantiating a restricted sandbox

<?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 /* Non-protected ini settings may set normally */ $sandbox->ini_set('html_errors',true ?>

访问变量

沙盒环境全局范围内的所有变量均可作为沙盒对象的属性进行访问。首先要注意的是,由于这两个线程之间的内存管理方式,因此目前不能在解释器之间交换对象和资源变量。此外,所有阵列都被深度复制,任何引用都将丢失。这也意味着口译员之间的参照是不可能的。

Example #2 Working with variables in a 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)' ?>

上面的例子将输出:

bar barbaz bool(false)

调用PHP函数

在沙盒中定义的任何函数都可以作为沙箱对象上的方法调用。这还包括几个伪函数语言结构:eval(),include,include_once,require,require_once,echo,print,die()和exit()。

Example #3 Calling sandbox functions

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

上面的例子将输出:

fbc

将参数传递给沙盒函数时,参数将从PHP的外部实例中获取。如果您希望从沙箱的作用域传递参数,请确保将它们作为沙箱对象的属性访问,如上所示。

Example #4 Passing arguments to sandbox functions

<?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' ?>

上面的例子将输出:

bar baz

更改Sandbox设置

从runkit版本0.5开始,可以使用ArrayAccess语法即时修改某些沙盒设置。一些设置,如active只读,旨在提供状态信息。其他设置,比如output_handler可以像正常的数组偏移一样设置和读取。未来的设置可能是只写的,但是目前没有这样的设置。

设置类型目的默认
活性布尔(只读)如果沙箱仍处于可用状态,则为TRUE;如果由于调用die(),exit()或因致命错误情况而导致请求处于救助状态,则为FALSE。真(初始)
output_handler回电话当设置为有效的回调时,Sandbox实例生成的所有输出将通过指定的函数进行处理。沙箱输出处理程序遵循与系统范围输出处理程序相同的调用约定。没有
parent_access布尔可以在沙箱中使用Runkit_Sandbox_Parent类的实例吗?必须启用其他Runkit_Sandbox_Parent相关设置才能工作。
parent_read布尔沙盒是否可以在其父项的上下文中读取变量?
parent_write布尔沙盒是否可以在其父上下文中修改变量?
parent_eval布尔沙盒是否可以评估其父代上下文中的任意代码?DANGEROUS
parent_include布尔可以在沙箱中的父代的上下文中包含php代码文件吗?DANGEROUS
parent_echo布尔可能沙盒回声数据在其父母的上下文中有效地绕过其自己的output_handler?
parent_call布尔可以在其父项的上下文中调用沙箱函数吗?
parent_die布尔可能沙盒杀死自己的父母吗?(并因此本身)
parent_scope整数家长财产访问的范围是什么?0 ==全局范围,1 ==调用范围,2 ==调用范围之前的范围,3 ==之前的范围等等...等等...0(全球)
parent_scope当parent_scope设置为字符串值时,它指向全局范围中的命名数组变量。如果命名变量在访问时不存在,它将被创建为一个空数组。如果变量存在但不是数组,则会创建一个虚拟数组,其中包含对指定全局变量的引用。

← runkit Functions

Runkit_Sandbox_Parent →