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

0 php url get function parentheses

这段代码是允许的吗?- > $_GET['function_name']然后().合并后,它将如下所示:$_GET['function_name']();

这就是我想要做的事情:

我有一个功能:

function a() {
echo "A";
}
Run Code Online (Sandbox Code Playgroud)

当我访问此URL时: www.myurl.com/?id = page1&function_name = a

我想从URL获取函数名称,所以:

echo ' .'$_GET['function_name']().' B C D E F G';
Run Code Online (Sandbox Code Playgroud)

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

new*_*rey 6

  1. 是的,这是允许的.

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

    <?php
    $function = 'print_r';
    $array = array(1, 2, 3, 4, 5);
    
    $function($array);
    
    Run Code Online (Sandbox Code Playgroud)

    它会像你正在使用一样工作$_GET['function'](); 数组的示例,以进一步清晰:

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

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

    让我们举一个更糟糕的情况,例如:

    <?php
    
    $function = $_GET['function'];
    $parameter = $_GET['parameter'];
    
    $function($parameter);
    
    Run Code Online (Sandbox Code Playgroud)

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

    www.example.com/page.php?function=exec&parameter=rm -rf %2f
    
    Run Code Online (Sandbox Code Playgroud)

    尽管如此,你可以做更多的事情(例如上传后门),但我认为这可以解决这个问题.