安全地将用户提供的数组字符串转换为PHP数组?

时间:2010-01-26 22:03:52

标签: php arrays

用户需要能够输入PHP参数数组。

目前,他们看到一个文本区域,他们希望输入定义数组的PHP代码:

<textarea name="foo">
$bar = array( 'key' => 'value' );
</textarea>

我得到文本区域的值,例如字符串$ _GET ['foo']。

我如何解析这个以便我可以使用数组$ bar?如果我能帮助它,我宁愿不使用eval。

谢谢!

5 个答案:

答案 0 :(得分:0)

我不确定您是否不想使用eval,因为它完全是出于您描述的目的。但是,由于评估用户输入是如此危险,这就是为什么你试图避免它?如果是这样,您唯一的选择可能是解析$_GET['foo']的值,删除所有危险或不需要的代码,然后eval

[修改] - 新答案

现在我考虑一下,如果您需要一个简单的解决方案供用户输入基于数组的数据,请查看parse_ini_string - http://us3.php.net/parse_ini_string。它将采用以下格式的字符串并为您提供关联数组。如果需要,您甚至可以使用多维数组。

one = 1
five = 5
animal = BIRD
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

答案 1 :(得分:0)

哦,怪异的。是的,避开了eval,这就是在寻找麻烦。我可能只是编写一个逐字符解析函数来验证输入是否是正确的格式,然后使用php的字符串处理函数来获取'key'和'value'并以这种方式构造数组。

答案 2 :(得分:0)

if(is_set($_GET['foo'])) // we have something 
{
 // do your security testing and ad it to var $foos
 // now proceed 
  foreach($foos as $foo)
  {
   echo $foo;
  }
}

答案 3 :(得分:0)

如果您不想使用eval(),则使用parse_str()是最佳选择:

$str = 'first=value&arr[]=foo+bar&arr[]=baz';

parse_str($str, $arr);

echo $arr['first'];  // value
echo $arr['arr'][0]; // foo bar
echo $arr['arr'][2]; // baz

tokenizer函数也可能是一个选项,但它会更复杂。

答案 4 :(得分:0)

如果你绝对必须让用户以这种方式定义数组,那么让他们将它定义为json会更好。它很容易转换,你不必像PHP代码那样lex它;比eval安全得多。另外,json是一种轻量级且易于定义数组的方法,因此它也将为用户提供更好的用户体验:)