是否允许使用$ _GET ['function_name']后的括号? - > $ _GET [ '函数名']();?

时间:2014-03-04 04:22:10

标签: php function url get parentheses

是否允许此代码? - > $_GET['function_name']然后()。合并后,它将如下所示:$_GET['function_name']();

这就是我想要做的事情:

我有一个功能:

function a() {
echo "A";
}

当我转到此网址时: www.myurl.com/?id=page1&function_name=a

我想从URL中获取函数名称:

echo ' .'$_GET['function_name']().' B C D E F G';

代码工作正常,但我只是很好奇。 $_GET['function_name']()好吗?如果这是一个糟糕的代码,还有其他方法吗?我不想要任何安全风险。谢谢你们!

1 个答案:

答案 0 :(得分:6)

  1. 是的,这是允许的。

    一个。使用变量/字符串作为函数名称是半常见的。如果您想测试,请尝试以下方法:

    <?php
    $function = 'print_r';
    $array = array(1, 2, 3, 4, 5);
    
    $function($array);
    

    它的工作原理与您使用$_GET['function']()时相同;数组的一个例子,为了更加清晰:

    <?php
    $user_data = array('function' => 'print_r');
    $values = array('one', 'two', 'three');
    
    $user_data['function']($values);
    
  2. 是的,这是一个非常糟糕的主意,也是您可能添加到网站的最大安全风险之一。

    一个。这样做将允许用户或“攻击者”(如果您想要从安全意义上考虑)在服务器上执行他们喜欢的任何代码。现在,如果你没有将任何用户控制的参数传递给函数,那么它们显然是有限的,但是,它们仍然会造成一些损害。

    让我们以更糟糕的情况为例:

    <?php
    
    $function = $_GET['function'];
    $parameter = $_GET['parameter'];
    
    $function($parameter);
    

    现在,如果我通过以下方式访问此页面该怎么办?

    www.example.com/page.php?function=exec&parameter=rm -rf %2f
    

    虽然,你可以做更多的事情(比如上传一个后门),但我认为这得到的重点是=]