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编程语言开发动态WAP页面
Oct 09 PHP
一个程序下载的管理程序(四)
Oct 09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
php将时间差转换为字符串提示
Sep 07 PHP
基于PHP中的常用函数回顾
Jul 11 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
PHP实现登录验证码校验功能
May 17 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
Laravel-admin之修改操作日志的方法
Sep 30 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
requireJS使用指南
2016/04/27 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
vue+animation实现翻页动画
2020/06/29 Javascript
深入理解javascript中的this
2021/02/08 Javascript
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Django中信号signals的简单使用方法
2019/07/04 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
航空大学应届生求职信
2013/11/10 职场文书
校园广播稿500字
2014/02/04 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
党员自我评价范文2015
2015/03/03 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
名人传读书笔记
2015/06/26 职场文书
学校食堂管理制度
2015/08/04 职场文书
防震减灾主题班会
2015/08/14 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
Python实现位图分割的效果
2021/11/20 Python