未定义的指数-安全风险与性能与代码膨胀



我正在合作一个项目,在该项目中,RESTAPI基本上在开发模式中中断,因为它有一个更包含错误的报告策略。这是这个项目中的一条典型线路:

public function someAction() {
   // Returns a map of params => values sent with HTTP req
   $params = $this->getParams();
   // This key may not exist --+
   //                          |
   //                          v
   $someField = $params['someField'] ?: 'default value';
   $someField = $this->sanitizeInput($someField);
   // ...
}

因此,开发模式下的JSON响应通常会充斥着PHP:注意:未定义索引警告,这将破坏JSON输出字符串。

我的问题

  • 假设变量已经初始化,特别是从$_GET或$_POST中提取变量时,安全风险(如果有的话)到底是什么
  • isset()array_key_exists()遍历并包装对某个假定数组密钥的每次访问是否值得
  • 我在整个应用程序的某些操作下,在引发未定义索引警告的各个键周围添加了isset(),但代码现在看起来超级臃肿

忽略这样的错误的问题正是你所发现的——调试变得非常痛苦,而真正的bug会被视为"正常行为"而不予理会。

然而,与编程中的任何其他时间一样,如果你发现自己一遍又一遍地编写相同的代码,你可能需要编写一个抽象。

在您的情况下,您可以向类添加一个额外的方法,以及getParams(可能只是返回$_REQUEST的内容),添加一个getParam()方法:

function getParam($key, $default=null)
{
    return isset($_REQUEST[$key])? $_REQUEST[$key] : $default;
}

然后您的呼叫代码变为:

$someField = $this->getParam('someField', 'default value');

EDIT您也可以将环境卫生调用添加到此方法中:

function getParam($key, $default=null)
{
    return isset($_REQUEST[$key])? $this->sanitizeInput($_REQUEST[$key]) : $default;
}

进一步减少您的呼叫代码。现在你不仅有了正确的无错误代码,而且你的呼叫代码从三行减少了:

$params = $this->getParams();
// This key may not exist --+
//                          |
//                          v
$someField = $params['someField'] ?: 'default value';
$someField = $this->sanitizeInput($someField);

收件人:

$someField = $this->getParam('someField', 'default value');
  1. 如果JSON传递PHP文件存在于单独的文件夹中,则应该为entore文件夹编写一个特定的自定义500响应(空JSON数据或JSON格式错误)
  2. 理想情况下,您应该对所有输入进行消毒,以防止各种攻击

请参阅https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide遵循最佳实践

最新更新