我正在合作一个项目,在该项目中,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');
- 如果JSON传递PHP文件存在于单独的文件夹中,则应该为entore文件夹编写一个特定的自定义500响应(空JSON数据或JSON格式错误)
- 理想情况下,您应该对所有输入进行消毒,以防止各种攻击
请参阅https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide遵循最佳实践