通过url调用php函数没有安全风险

通过url调用php函数没有安全风险,php,function,security,call,Php,Function,Security,Call,您好,我还在学习php,并试图通过url链接调用php函数,我确实找到了这段代码 if(function_exists($_GET['f'])) { $_GET['f'](); } 但这对我的功能不安全,所以我做了类似的事情 if($_GET['f']=='mouner'){ function mouner(){ $s = 'my name is mouner'; return($s); } echo mouner(); } 那是安全代码吗?如果不是通过url调用函数而没有安

您好,我还在学习php,并试图通过url链接调用php函数,我确实找到了这段代码

if(function_exists($_GET['f'])) {
$_GET['f']();
}
但这对我的功能不安全,所以我做了类似的事情

if($_GET['f']=='mouner'){
function mouner(){
    $s = 'my name is mouner';
    return($s);
}
echo mouner();
}

那是安全代码吗?如果不是通过url调用函数而没有安全风险的最佳方法,那么第一个选项的风险非常大,这就是为什么需要验证用户输入(包括GET参数)


你的第二个选择就是这样。该代码并不完美,但确实解决了这一严重漏洞。

正如@JuliePelletier所建议的,在执行任何相关功能之前,您需要检查用户输入。另一个简便的方法可能是这样的:

$funcs["foo"] = function()
{
    echo "In foo function";
};

$funcs["bar"] = function()
{
    echo "In bar function";
};

if (isset($funcs[$_GET["f"]]))
    $funcs[$_GET["f"]]();

将函数(匿名或仅按其名称)存储在允许函数的关联数组中,然后执行这些函数。

Julie给出了正确答案,只是提供了一些代码清理:

if($_GET['f'] == 'mouner'){
    $s = 'my name is mouner';
    echo $s;
}
如果您希望结果有很大的变化,可以像这样使用
switch()

if(isset($_GET['f'])){
  $s = "My name is ";
  switch($_GET['f']){
    case 'mouner':
      $s .= "Mouner";
      break;
  }
  echo $s;
}

在php中调用
函数
时,不需要将
echo
添加到语句中。。!另外,您不需要将
函数mouner(){}
放在
if
函数中,因为您可能知道,您将函数声明为本地函数,您可能无法在this if函数之外的其他地方调用该函数。。!你说的安全风险是什么意思?同样,当你在你的第一个代码中写到:
if(函数存在($\u GET['f']))
as
if(isset($\u GET['f']))
我知道但你不知道。。!一个更具体的例子可能会有帮助。。。现在,您可以执行echo“我的名字是穆纳”在你的if中,它将是完全等效的。谢谢这帮了我很多忙。很久没有看到这样做了哈哈!我投了另一个建议的票;-)