ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 12:29:48  阅读:223  来源: 互联网

标签:security sanitization php design-patterns


我正在一个项目中进行开发,该项目的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有