php-未定义索引-安全风险vs性能vs代码膨胀
作者:互联网
我正在一个项目中进行开发,该项目的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(),这些键在整个应用程序中的某些操作下会引发未定义索引警告,但是代码现在看起来super肿了…
解决方法:
忽略这样的错误的问题正是您所发现的-调试变得非常痛苦,潜在的实际错误被视为“正常行为”而被忽略.
但是,与编程中的其他时间一样,如果您发现自己一遍又一遍地编写相同的代码,则可能需要编写抽象.
在您的情况下,您可以向该类添加一个附加方法,以及getParams(大概只是返回$_REQUEST的内容),添加一个getParam()方法:
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');
标签:security,sanitization,php,design-patterns 来源: https://codeday.me/bug/20191119/2036295.html