首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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文件以获取更多信息。

构造函数

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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));');
?>

上面的例子将输出:

代码语言:javascript
复制
bar
barbaz
bool(false)

调用PHP函数

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

Example #3 Calling sandbox functions

代码语言:javascript
复制
<?php
$sandbox = new Runkit_Sandbox();

echo $sandbox->str_replace('a','f','abc');
?>

上面的例子将输出:

代码语言:javascript
复制
fbc

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

Example #4 Passing arguments to sandbox functions

代码语言:javascript
复制
<?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');
?>

上面的例子将输出:

代码语言:javascript
复制
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 →

扫码关注腾讯云开发者

领取腾讯云代金券