更改$ _POST以在PHP中分隔函数参数

时间:2012-03-18 12:24:11

标签: php ajax parsing variables post

问题很容易解释。我想要做的是基于$ _POST变量创建一个对象,参数和函数调用。

$obj = new $_POST['object']['name']($_POST['object']['params']);

            return json_encode(
                 $obj->$_POST['function']['name']($_POST['function']['params'])
            );

这里唯一的问题是它将参数作为数组提供。我希望它用逗号分隔变量,例如:$obj->function($var1 , $var2, $var3);。我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:3)

这可以完成,但您应该只使用要创建的可能对象的白名单来完成。否则它有点危险。这个开放的系统可能不是一个好主意。如果您可以重新考虑这个问题,可能会以不同的方式处理它。

要解决您的问题,您可以使用这样的结构:

// Possible values:
$acceptable_classes = array('myClass1', 'myClass2', 'myClass3');

// If it is an allowed class,
if (in_array($_POST['object']['name'], $acceptable_classes) {
  // Store it in a variable.
  $class = $_POST['object']['name'];

  $obj = new $class;
}

您需要为该功能保留类似的白名单。您可以使用多维数组。您可以扩展它以保持可能功能的可接受参数。它可以很快地吹出比例,但有助于保持安全。

$acceptable_classes = array(
  'myClass1' => array(
    'func1', 'func2'
  ),
  'myClass2' => array(
    'func3', 'func4'
  )
);

if ($acceptable_classes, array_key_exists($_POST['object']['name']) {
  if (in_array($_POST['function']['name'], $acceptable_classes($_POST['object']['name'])) {
    // Store it in a variable.
    $class = $_POST['object']['name'];

    $obj = new $class;
    $func = $_POST['function']['name'];
    return json_encode($obj->$func($_POST['function']['params']));
  }
}

答案 1 :(得分:2)

做这样的事情:

call_user_func_array( array($obj, $_POST['function']['name']), $_POST['function']['params'])
call_user_func_array函数

Documentation

答案 2 :(得分:2)

call_user_func_array()正是您要找的。另外,运行$ _POST值是一个安全风险,我希望你能正确消毒它们。

答案 3 :(得分:1)

最好的方法是创建没有传递给构造函数的参数的对象,并使用其他方法启动它。例如:

$obj = new $_POST['object']['name']();
$result = call_user_func_array(array($obj,'init'),$_POST['object']['params']);

此外,在PHP 5.4+中,您可以使用此“hack”:

$reflection = new ReflectionClass($_POST['object']['name']);
$obj = $reflection->newInstanceWithoutConstructor();
call_user_func_array(array($obj,'__constructor'),$_POST['object']['params']);

但我建议你改变你的架构,这样你就可以“按原样”将数组传递给构造函数。

答案 4 :(得分:0)

让函数采用数组

$name = $_POST['object']['name'];

$obj = new $name;

$array = explode(',', $_POST['object']['params'];
$obj->function($array);