php开发时容易忘记的一些技术细节


Posted in PHP onFebruary 03, 2016

在做开发的时候,有可能会忘记掉一些技术细节。这些细节有可能会造成很严重的后果,比如网站被注入、网站崩溃等等。现在我们总结一下,有可能会遇到的一些 PHP 中的一些 “陷阱”。

陷阱一:empty()

<?php
//以下代码会直接导致PHP解析错误
$arr1 = [1, 2, 3];
$arr2 = [3, 4];
if(empty(array_diff($arr1, $arr2))) { //解析错误
  echo 'empty';
} else {
  echo 'not empty';
}

最新的官网手册对此有特别说明:

Note:

在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。

换言之,下列代码不会生效: empty(trim($name))。 作为替代,应该使用trim($name) == false.
我最近一次遇到该错误,是使用 Phalcon 开发的时候,服务器一直报 503 错误,刚开始会觉得莫名其妙,通过逐行排除,才发生由于 empty 的错误用法导致的。当然,自从 PHP 5.5 开始,empty 已经支持这种写法了。

陷阱二:in_array()

<?php
//判断数组里是否存在用户所提交的用户 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(in_array($post_dirty_id, array_keys($safe_arr))) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:find me,此结果明显错误

我发现这个问题,是因为网站被 SQL 注入了,还好,那么时候在测试的时候发现的,没有造成严重的后果。

关于 in_array() 函数使用,还有其他值得我们注意的地方,PHP 手册中,有大量的网友提供的示例,来说明该函数的“怪异”行为,比如:

<?php
 $a = ['a', 32, true, 'x' => 'y'];
 var_dump(in_array(25, $a)); // true, one would expect false
 var_dump(in_array('ggg', $a)); // true, one would expect false
 var_dump(in_array(0, $a)); // true
 var_dump(in_array(null, $a)); // false

为了安全起见,建议可以采用下面这种方式进行判断:

<?php
//判断数组里是否存在用户提交的 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(isset($safe_arr[$post_dirty_id])) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:do not find me,这是正确的结果
PHP 相关文章推荐
如何获得PHP相关资料
Oct 09 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
php实现paypal 授权登录
May 28 PHP
CodeIgniter整合Smarty的方法详解
Aug 25 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
PHP程序守护进程化实现方法详解
Jul 16 PHP
php实现记事本案例
Oct 20 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 #PHP
PHP实现的构造sql语句类实例
Feb 03 #PHP
PHP快速生成各种信息提示框的方法
Feb 03 #PHP
PHP实现原比例生成缩略图的方法
Feb 03 #PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 #PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 #PHP
PHP开发中常用的十个代码样例
Feb 02 #PHP
You might like
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Python多线程学习资料
2012/12/19 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
python随机模块random使用方法详解
2020/02/14 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
《乌塔》教学反思
2014/02/17 职场文书
优秀员工评优方案
2014/06/13 职场文书
人力资源部岗位职责
2015/02/11 职场文书
地震慰问信
2015/02/14 职场文书
离婚代理词范文
2015/05/23 职场文书