Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML中的PHP函数?_Php_Xml_Simplexml_Eval - Fatal编程技术网

XML中的PHP函数?

XML中的PHP函数?,php,xml,simplexml,eval,Php,Xml,Simplexml,Eval,可以用XML编写PHP函数吗 <doThis> doThis(){ bang bang bang! } </doThis> 首先,您应该始终考虑运行像这样的“代码”的安全含义。如果此XML文件具有远程源,并且您执行了代码,那么它可能会执行任何操作。执行(rm-fR/some/important/path)怎么样?还是删除所有内容的数据库调用?发送方和您的代码之间需要有一种非常牢固的信任关系,还需要有强大的安全协议来防止中间人攻击和其他攻击 对你的问题来说,这是不可能

可以用XML编写PHP函数吗

<doThis>

doThis(){
bang bang bang!
}

</doThis>

首先,您应该始终考虑运行像这样的“代码”的安全含义。如果此XML文件具有远程源,并且您执行了代码,那么它可能会执行任何操作。执行(rm-fR/some/important/path)怎么样?还是删除所有内容的数据库调用?发送方和您的代码之间需要有一种非常牢固的信任关系,还需要有强大的安全协议来防止中间人攻击和其他攻击

对你的问题来说,这是不可能的。正如所评论的,XML是数据,而不是代码,并且应该是可移植的,这意味着您的PHP代码对于接受此XML的另一个客户端来说将是无意义的

但是,您可以使用
eval
。也许是这样:

eval($foo->doThis);
<doThis><?php
doThis()
{
   bang bang bang!
}    
?></doThis>

注意:我根本不推荐这个。这不是XML的预期用途,它有很多问题。请想想其他的方式。

首先,你应该总是考虑运行像这样的“代码”的安全含义。如果此XML文件具有远程源,并且您执行了代码,那么它可能会执行任何操作。执行(rm-fR/some/important/path)怎么样?还是删除所有内容的数据库调用?发送方和您的代码之间需要有一种非常牢固的信任关系,还需要有强大的安全协议来防止中间人攻击和其他攻击

对你的问题来说,这是不可能的。正如所评论的,XML是数据,而不是代码,并且应该是可移植的,这意味着您的PHP代码对于接受此XML的另一个客户端来说将是无意义的

但是,您可以使用
eval
。也许是这样:

eval($foo->doThis);
<doThis><?php
doThis()
{
   bang bang bang!
}    
?></doThis>

注意:我根本不推荐这个。这不是XML的预期用途,它有很多问题。请考虑其他方法。

XML支持嵌入所谓的,有效的XML可以如下所示:

eval($foo->doThis);
<doThis><?php
doThis()
{
   bang bang bang!
}    
?></doThis>
最后一行中回声的输出为:

bang bang bang!
(让人吃惊)。您可以在内部将其映射到SimpleXMLElement,以将其简化为上面的示例代码:

$foo = simplexml_load_string($xml, 'PiSimpleXMLElement');
echo $foo->doThis();   //bang bang bang!
其工作原理如下:

/**
 * SimpleXMLElement integration of PiDOMDocument
 */
class PiSimpleXMLElement extends SimpleXMLElement
{
    public function __call($name, $args) {
        $doc = new PiDOMDocument();
        $doc->loadXML($this->asXML());
        $callback = array($doc->getObject(), $name);
        return call_user_func_array($callback, $args);
    }
}
作为PHP处理器,您可以使用
eval
include
()。PHP是直接执行的,因此如果您的代码有致命的解析错误,整个脚本有致命的错误,如果您不喜欢这种PHP默认行为,您可以在评估字符串是否存在此类错误之前对其进行解析,请参见和或


我在我的/

中选择了一个未验证的
eval
,XML支持嵌入所谓的,有效的XML可以如下所示:

eval($foo->doThis);
<doThis><?php
doThis()
{
   bang bang bang!
}    
?></doThis>
最后一行中回声的输出为:

bang bang bang!
(让人吃惊)。您可以在内部将其映射到SimpleXMLElement,以将其简化为上面的示例代码:

$foo = simplexml_load_string($xml, 'PiSimpleXMLElement');
echo $foo->doThis();   //bang bang bang!
其工作原理如下:

/**
 * SimpleXMLElement integration of PiDOMDocument
 */
class PiSimpleXMLElement extends SimpleXMLElement
{
    public function __call($name, $args) {
        $doc = new PiDOMDocument();
        $doc->loadXML($this->asXML());
        $callback = array($doc->getObject(), $name);
        return call_user_func_array($callback, $args);
    }
}
作为PHP处理器,您可以使用
eval
include
()。PHP是直接执行的,因此如果您的代码有致命的解析错误,整个脚本有致命的错误,如果您不喜欢这种PHP默认行为,您可以在评估字符串是否存在此类错误之前对其进行解析,请参见和或


我在我的/

中选择了未验证的
评估
,不,这是不可能的。XML是数据,不是对象;如果非PHP语言以某种方式读取该文件会怎么样?不可能。为什么不使用普通的
include
require
?可能您可以将PHP代码写入PHP文件,然后动态地包含它,但这样做应该会有一些安全问题,因为代码将有点“注入”在没有检查代码的情况下对你的系统进行测试,如果代码可能是暴力的,那么答案是否定的,这是不可能的。XML是数据,不是对象;如果非PHP语言以某种方式读取该文件会怎么样?不可能。为什么不使用普通的
include
require
?可能您可以将PHP代码写入PHP文件,然后动态地包含它,但这样做应该会有一些安全问题,因为代码将有点“注入”在没有检查代码的情况下访问系统,如果代码可能是暴力的