2011-09-22 108 views
0

我正在制作一个函数,以便我可以使用通用函数在Ajax中传递参数,以避免必须为每个Ajax函数创建一个php文件。PHP:如何在这里使用params?

这是我的功能看起来如何,现在在PHP端接收后,通过后,就可以在代码中看到的PARAMS:

$class_name = $_POST['class_name']; 
$function_name = $_POST['function_name']; 
$params = "'" . implode("','", $_POST['params']) . "'"; 
$model = new $class_name(); 

//Apply the function 
echo $model->$function_name($params); 

据工作除了从则params的一部分。 PHP将它解释为一个参数,我该怎么做才能让$ params不被解释为单个字符串?

+3

这段代码允许执行相当危险的任意代码。我希望这是一个简化的例子,删除类和方法名称的白名单检查。 – johannes

+0

不完全是任意的;它必须是一个定义(或自动加载)类的方法。 (例如,你不能调用一些全局的'makeMeAnAdmin()'函数)。但是,如果没有某种白名单(或者至少是类中的一个'isCallable'变量/方法,这可能是危险的,一种分布式白名单)。 – cHao

回答

3

第三行实际上使得$params包含所有PARAMS一个字符串。

根据您的框架(以及您如何将参数传递到您的Ajax内容中),您可能可以将$_POST['params']按原样传递给方法,而不是传递$params。在这种情况下,你根本不需要构建字符串。

如果需要调用需要的PARAMS要单独传递,而不是像一个数组的功能,尝试

​​

如果$params包含1,2,3,和$function_name是' foo',上述表达式将相当于$model->foo(1, 2, 3)

请注意,这会让人们调用任何可用于脚本的类的公共方法。您需要某种访问控制才能防止人们随意运行。正如您对问题的评论中所建议的那样,某种类型的白名单(即使它只是一个成员变量,表示该类是否意味着被像这样的随机代码使用)将大大有助于防止安全问题。

+0

谢谢!正是我需要的! – luqita

0

不要撞击它们。将它们作为数组传递,就好像$_POST一样。

echo $model->$function_name($_POST['params']); 
+0

这将意味着修改功能,这不是想法...一些功能接收3个参数,其他功能4,这必须灵活 – luqita

+1

这可能是。但是你的问题问到如何使$ params不被解释为单个字符串。通过执行implode,可以使$ params成为单个字符串。 –