如何将PHP字符串作为变量进行评估?

时间:2010-08-15 19:59:08

标签: php xml eval simplexml associative-array

我有一个名为$data["main_deal"]的变量,其值为$xml->deals->deal[0](作为字符串)。 $ xml是一个simpleXML对象,main_deal的值是访问我想要的数据所需的选择器。

当我尝试echo "<p><b>Main Deal:</b> ".$data["main_deal"];输出时:主要交易: $ xml-&gt; deals-&gt; deal [0]

所以我回到了$data["main_deal"]的值,并添加了eval()。输出现在为空白。当我致电$data["main_deal"]时,我希望它输出$xml->deals->deal[0]的值,而不是“$ xml-&gt; deals-&gt; deal [0]”。我该怎么做?

修改 这是我用来加载$ data的代码:

foreach($vars as $var) {
$data[$var] = $devOptions[$var];
}

$ devOptions [$ var]包含一个字符串,例如“$ xml-&gt; deals-&gt; deal [0]”。

2 个答案:

答案 0 :(得分:1)

eval('return '.$data['main_deal'].';');

答案 1 :(得分:1)

请注意,使用eval对于精神错乱是危险的。如果某人以某种方式将$data['main_deal']设置为exec("rm -rf .")mysql_query('drop table users'),该怎么办?您必须绝对确定此字符串不会以任何方式受到污染,以确保安全。这是非常重要的,因为大多数过滤器都是为了防止XSS注入,而不是这种类型的攻击。

我不是故意成为一个混蛋,我意识到你只是想完成一份工作,但我认为这不足为力。


我在评论中注意到你问了这个问题:

  

这是否有意义,或者有更好的方法吗?

很有可能有更好的方法来做到这一点,但是如果不了解更多关于XML和用户需求的信息,很难说。您说示例选择可能是$xml->deals->deal[0]。用户是否只需要能够选择该交易的索引?例如,您是否可以让他们从下拉菜单中选择要选择的交易?然后你就可以存储他们想要的整数,并且访问这些数据会更安全,更简单。

如果他们需要更多的控制权,也许你可以给他们一些下拉菜单来帮助他们建立所需元素的“路径”。例如:

[ Element 1 (v)]  [ Element 2 (v)] [ Field (v)]
 | Deals       |   | Deal        |  | 0       |
 | Steals      |   | Steal       |  | 1       |
 | Wheels      |   | Wheel       |  |_________|
 |_____________|   |_____________|

然后在你的代码中

 $array_of_valid_element1 = array ('Deals', 'Steals', 'Wheels');

 if(
    in_array($_POST['element1'], $array_of_valid_element1)
    &&
    in_array($_POST['element2'], $array_of_valid_element2)
    &&
    in_array($_POST['element3'], $array_of_valid_element3)
 )
 {
     echo $xml->$_POST['element1']->$_POST['element2'][$_POST['element3'];
 }

您可以看到额外验证的来源!通过检查每个元素,确保用户只做他们明确允许的事情。

我希望这可以为您提供一些想法或帮助您重新考虑是否采用最佳方法。如果您想对此提出更多意见,请随意提出另一个问题。这并不简单,但这才是它的乐趣!