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 不同编码下的字符串长度区分
Sep 26 PHP
php 连接mssql数据库 初学php笔记
Mar 01 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
Laravel 实现添加多语言提示信息
Oct 25 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后门代码解析
2014/07/05 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python yield 使用浅析
2015/05/28 Python
Python适配器模式代码实现解析
2019/08/02 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
前台文员个人求职信范文
2014/01/05 职场文书
甜点店创业计划书
2014/01/27 职场文书
高一学生期末评语
2014/04/25 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
体育节口号
2014/06/19 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
新闻稿怎么写
2015/07/18 职场文书
教师节校长致辞
2015/07/31 职场文书
MySQL系列之三 基础篇
2021/07/02 MySQL
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技