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 相关文章推荐
PHP4和PHP5共存于一系统
Nov 17 PHP
PHP小程序自动提交到自助友情连接
Nov 24 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
Jun 07 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
thinkphp5实现无限级分类
Feb 18 PHP
PHP unset函数原理及使用方法解析
Aug 14 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扩展编写点滴 技巧收集
2010/03/09 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
python 字符串格式化代码
2013/03/17 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
理论讲解python多进程并发编程
2018/02/09 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
python实现梯度法 python最速下降法
2020/03/24 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
俞敏洪励志演讲稿
2014/04/29 职场文书
小学感恩节活动总结
2015/03/24 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android
Nginx如何配置根据路径转发详解
2022/07/23 Servers