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

时间:2015-11-11 13:09:33

标签: php security design-patterns sanitization

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

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(),但代码看起来非常臃肿......

2 个答案:

答案 0 :(得分:4)

忽略这样的错误的问题正是你所发现的 - 调试成为一个巨大的痛苦,而且可能的真正错误被视为“正常行为”。

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

在您的情况下,您可以向该类添加其他方法,以及getParams(可能只返回$_REQUEST的内容),添加getParam()方法:< / p>

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

然后你的主叫代码变成:

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

编辑您也可以将卫生调用添加到此方法中:

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 :(得分:-1)

  1. 如果您的JSON提供PHP文件存在于单独的文件夹中,您应该为entore文件夹编写特定的自定义500响应(空JSON数据或JSON格式错误)
  2. 理想情况下,您应该清理所有输入以防止各种攻击
  3. 请参阅https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide以遵循最佳做法