【问题标题】:Is parentheses after $_GET['function_name'] allowed? --> $_GET['function_name']();?$_GET['function_name'] 后面的括号是否允许? --> $_GET['function_name']();?
【发布时间】:2014-04-05 10:50:30
【问题描述】:

此代码是否允许? -> $_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']() 好吗?如果这是一个糟糕的代码,还有其他方法吗?我不希望有任何安全风险。谢谢各位!

【问题讨论】:

  • 谢谢你们!我真的很感谢你的回复。看到您的反应如此之快,我感到很惊讶..

标签: php function url get parentheses


【解决方案1】:
  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
    

    尽管您可以做更多事情(例如上传后门),但我认为这就是重点 =]

【讨论】:

  • 使用的第一个示例并没有尽可能地反映原始问题,请参阅ideone.com/dWRpbO(它更好地“反映了问题” - 也就是说,密钥是已知的,但 value 是通过 $_GET 提供的——即使它最终是同一个问题)
  • @user2864740 实际上,它完美地反映了它; $_GET['function_name']$function 完全相同——它们都包含一个作为函数名称的字符串;我的第一个示例只是通过简单的变量(而不是数组索引)演示如何将字符串用作函数名。如果您希望我更新以将其显示为数组,我也可以轻松地做到这一点(尽管您提供的链接正是如此,就像我的第二个示例一样)。
  • 不,第一个例子错过了间接。因此它不可能是“完美的”。它显示了函数调用在 a 构造上的间接调用,而不是在 the(或者更确切地说,镜像)构造上的间接调用。 PHP 并不完全以一致性着称。
  • @user2864740 我不确定我明白你在说什么......我以为我们在谈论使用字符串作为函数名(无论字符串是存储在数组中还是标量)?如果是这样,我想我提出了这一点;否则,我可能需要您进一步澄清。我刚刚在第一个示例中添加了第二个示例,它使用相同的代码,但使用了一个包含函数名称的数组(不确定这是否是您所追求的?)
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多