php字符串转为可执行,通过PHP自定义协议实现把字符串代码变为可以执行代码

这篇博客介绍了如何通过自定义PHP流包装器`stringToPHPStream`将字符串`$str_code`转换为可执行的PHP数组,避免使用不安全的`eval`函数。示例展示了如何注册协议,以及`stringToPHPStream`类的关键实现,包括`stream_open`方法。
摘要由CSDN通过智能技术生成

以crossphp中解析注释配置为例,定义协议名:annotate

$str_code = 'array("foo"=>"bar")';

stream_register_wrapper("annotate", "stringToPHPStream");

$var = include ("annotate://{$str_code}");

print_r($var);

这样字符串$str_code就变成了一个php的array, 远离eval吧,骚年~

如果要更改示例中协议名称,请更改stringToPHPStream这个类中的stream_open方法

1.[代码][PHP]代码

include __DIR__.'/stringToPHPStream.php';

$str_code = 'array("foo"=>"bar")';

stream_register_wrapper("annotate", "stringToPHPStream");

$var = include ("annotate://{$str_code}");

print_r($var);

2.[文件] stringToPHPStream.php ~ 1KB     下载(19)

/**

* 字符串php代码通过wrapper转换为可以执行的php代码

*

 
 

* 使用方式 stream_register_wrapper("自定义名字", "stringToPHPStream")

* $var = include ("自定义名字://字符串代码")

*

*

* @Auth: wonli

* Class StringToPHPStream

* @package Cross\Lib\Other

*/

class StringToPHPStream {

/**

* 代码内容

*

* @var array

*/

static $content;

/**

* 在$content中的标示

*

* @var string

*/

protected $key;

/**

* @var int

*/

protected $pos;

/**

* @param $path

* @param $mode

* @param $options

* @param $opened_path

* @return bool

*/

public function stream_open($path, $mode, $options, $opened_path) {

$this->key = md5($path);

if (! isset(self::$content[$this->key])) {

self::$content[$this->key] = sprintf('<?php return %s;', substr($path, 11));

}

$this->pos = 0;

return true;

}

/**

* @param $count

* @return string

*/

public function stream_read($count) {

$content = self::$content[$this->key];

$ret = substr($content, $this->pos, $count);

$this->pos += strlen($ret);

return $ret;

}

/**

*

*/

public function stream_stat() {

}

/**

*

*/

public function stream_eof() {

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值