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_dir
。safe_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_Sandbox_Parent →