Php Eval和数组索引作为变量

Php Eval和数组索引作为变量,php,eval,Php,Eval,我以前做过一个关于尝试使用数组索引作为变量名的主题,并收到了一个我感兴趣的答案 其中一个答案建议使用eval(),但由于其潜在的安全问题,不建议使用eval() $string = 'welcome["hello"]'; eval('$' . $string . " = 'thisworks';"); // This also works : eval("$$string = 'thisworks';"); // I could then print the array keys value

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

其中一个答案建议使用eval(),但由于其潜在的安全问题,不建议使用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管理面板上工作,上面有用户可以设置的各种选项。每个选项都是通过包含多维数组的变量设置的,如下所示(仅大得多):

当用户保存选项时,会触发一个函数,用所有不同的输入值创建一个数组,并将其保存到数据库中。如下所示,尽管高度精简:

foreach ( $options as $o ) {
 if ( isset( $_POST[ $o[ 'id' ] ] ) ) {
  $settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ];
 }
}
多维选项变量中的某些选项将保存为数组的一部分,而不是字符串。这些选项的ID中包含方括号,如“option_ID[value1]”

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

这就是为什么eval解决方案是理想的。它允许我创建一个已经是数组并包含索引的变量,而不必使用其他函数来分离ID。它严重减少了冗长的过程,至少我相信是这样


因此,本质上,是否有一种更安全、类似的方法可以使用eval,或者使用其他功能。以上述方式使用eval有哪些危险?恶意代码能否在上述上下文中执行?在$之前执行代码肯定会导致PHP错误吗?

以这种方式使用eval对我来说似乎是一种攻击,不太可能执行。为什么不使用变量来实现同样的事情呢

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

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

在评估
eval
的潜在危险时,注意字符串的来源非常重要。由于字符串是用户生成的(您没有100%的控制权),eval是不可能的。事实上,我最近在尝试通过读取
解析括号的键来“修复”
$\u POST
数据时遇到了这个问题php://input
这样我就可以创建数组(PHP对某些输入键做了一些修改)。你应该详细说明“将一些保存为数组,将一些保存为字符串”。不清楚你在做什么。举出充分充实的例子。我感觉你已经选择了错误的解决方案。你到底想干什么?是否保存一些用户设置?如何将其保存到数据库,序列化?如果你感兴趣的话,需要更多的上下文来给出一个对你有帮助的好答案。如果你只是想解决这个小难题,那就另当别论了。谢谢大家的支持@韦斯利,我还没有真正使用过这个解决方案,但我想看看是否有可能让它以一种安全的方式工作,因为这似乎是最好的解决方法。你有没有想出什么办法来“修复”这篇$\u文章?本质上,在ID中搜索[]的原因是$\u POST['option\u ID[value1]']不起作用。如果是这样,就不会有问题了。是的,我正在尝试保存一些用户设置,但其中一些需要保存为数组,并且各种输入允许用户更改其中一个数组属性的值。
$string = 'welcome';
$key = "hello";

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