Eval和数组索引作为变量

时间:2012-05-12 20:33:44

标签: php eval

我之前提出了一个关于尝试使用数组索引作为变量名的主题,并收到了一个让我感兴趣的答案here

使用eval()建议的答案之一,但由于其潜在的安全问题而不建议使用。

$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");

// This also works : eval("$$string = 'thisworks';");

// I could then print the array keys value like this
print( $welcome["hello"] ); // Prints 'thisworks'

然而,这个解决方案是最简单的,并且可能是我想要实现的最合适的解决方案。我实际上正在使用Wordpress管理面板,其中包含用户可以设置的各种选项。每个选项都是通过一个包含多维数组的变量设置的,就像这样(只有更大):

$options = array(
 array(
  'id' => 'option_id', // The name of the input field
  'type' => 'text', // Input type
  'value' => 'some value here' // Input value
 )
);

当用户保存选项时,会触发一个函数,从所有各种输入值中创建一个数组并将其保存到数据库中。如下所示,虽然高度剥离:

foreach ( $options as $o ) {
 if ( isset( $_POST[ $o[ 'id' ] ] ) ) {
  $settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ];
 }
}

多维选项变量中的一些选项将保存为数组的一部分,而不是字符串。这些选项在ID中包含方括号,如'option_id [value1]'。

这是事情变得复杂的地方。目前,我必须通过检查方括号[]的函数发送ID,然后告诉保存函数如何正确处理它(保存为数组或字符串)。

这就是eval解决方案理想的原因。它允许我创建一个已经是数组并包含索引的变量,而不必使用其他函数来传播ID。它严重减少了漫长的过程,或者我相信。

所以从本质上讲,是否有一种更安全,类似的方式可以使用eval或使用替代功能。在上面使用eval有什么危险?恶意代码可以在上面使用的上下文中执行吗?肯定在$之前执行代码会导致PHP错误吗?

1 个答案:

答案 0 :(得分:3)

以这种方式使用eval对我来说似乎是一种破坏,并且不太可能具有高效性。为什么不使用变量来实现同样的事情呢?

$string = 'welcome';
$key = "hello";

${$string}[$key] = "this works better";
print( $welcome["hello"] ); // Prints 'this works better'