QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2900|回复: 5

[PHP开发] PHP 中的一些 “陷阱”

[复制链接]

273

主题

292

帖子

1133

积分

中级会员

Rank: 3Rank: 3

积分
1133
发表于 2016-2-3 10:12:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在做开发的时候,有可能会忘记掉一些技术细节。这些细节有可能会造成很严重的后果,比如网站被注入、网站崩溃等等。现在我们总结一下,有可能会遇到的一些 PHP 中的一些 “陷阱”。
陷阱一:empty()
  1. <?php
  2. //以下代码会直接导致PHP解析错误

  3. $arr1 = [1, 2, 3];
  4. $arr2 = [3, 4];

  5. if(empty(array_diff($arr1, $arr2))) { //解析错误

  6.     echo 'empty';

  7. } else  {

  8.     echo 'not empty';

  9. }
复制代码
最新的官网手册对此有特别说明:
  1. Note:
  2. 在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。
  3. 换言之,下列代码不会生效: empty(trim($name))。 作为替代,应该使用trim($name) == false.
复制代码
我最近一次遇到该错误,是使用 Phalcon 开发的时候,服务器一直报 503 错误,刚开始会觉得莫名其妙,通过逐行排除,才发生由于 empty 的错误用法导致的。当然,自从 PHP 5.5 开始,empty 已经支持这种写法了。
陷阱二:in_array()
  1. <?php

  2. //判断数组里是否存在用户所提交的用户 ID

  3. //$post_dirty_id = '1092';
  4. $post_dirty_id = '1092 ORDER BY #1';

  5. $safe_arr = [
  6.     987 => '小明',
  7.     1092 => '汤姆',
  8.     1256 => '奥立升'
  9. ];

  10. if(in_array($post_dirty_id, array_keys($safe_arr))) {

  11.     echo 'find me';

  12. } else {

  13.     echo 'do not find me';

  14. }

  15. //输出结果:find me,此结果明显错误
复制代码
我发现这个问题,是因为网站被 SQL 注入了,还好,那么时候在测试的时候发现的,没有造成严重的后果。
关于 in_array() 函数使用,还有其他值得我们注意的地方,PHP 手册中,有大量的网友提供的示例,来说明该函数的“怪异”行为,比如:
  1. <?php

  2. $a = ['a', 32, true, 'x' => 'y'];
  3. var_dump(in_array(25, $a)); // true, one would expect false
  4. var_dump(in_array('ggg', $a)); // true, one would expect false

  5. var_dump(in_array(0, $a)); // true
  6. var_dump(in_array(null, $a)); // false
复制代码
为了安全起见,建议可以采用下面这种方式进行判断:
  1. <?php

  2. //判断数组里是否存在用户提交的 ID

  3. //$post_dirty_id = '1092';
  4. $post_dirty_id = '1092 ORDER BY #1';

  5. $safe_arr = [
  6.     987 => '小明',
  7.     1092 => '汤姆',
  8.     1256 => '奥立升'
  9. ];

  10. if(isset($safe_arr[$post_dirty_id])) {

  11.     echo 'find me';

  12. } else {

  13.     echo 'do not find me';

  14. }

  15. //输出结果:do not find me,这是正确的结果
复制代码
如果遇到其他的问题,我都会在这里记录...

642

主题

798

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
10863
发表于 2016-2-3 10:47:32 | 显示全部楼层
感谢楼主分享
招募核心会员担任PHP-Z版主和管理员,共同管理论坛和群组,有意者在论坛发消息联系我

0

主题

58

帖子

1101

积分

中级会员

Rank: 3Rank: 3

积分
1101

灌水之王

发表于 2016-2-18 09:45:33 | 显示全部楼层

感谢楼主分享
Life is the art of drawing without an eraser.

4

主题

77

帖子

2896

积分

中级会员

Rank: 3Rank: 3

积分
2896

灌水之王活跃会员

发表于 2016-2-18 21:14:56 | 显示全部楼层
感谢楼主分享

1

主题

24

帖子

609

积分

注册会员

白贝贝

Rank: 2

积分
609

活跃会员

QQ
发表于 2016-2-19 18:12:32 | 显示全部楼层
今天我也发现empty这个问题了。原来不只是我遇到这个问题
-----不联系,并不代表忘记

4

主题

77

帖子

2896

积分

中级会员

Rank: 3Rank: 3

积分
2896

灌水之王活跃会员

发表于 2016-2-21 22:03:45 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

     
    战略合作|联系方式|广告赞助|商务合作|手机版|小黑屋|( 京ICP备14036609号-6 )

GMT+8, 2017-12-15 19:53

© 2013-2017 Powered by Discuz! X3.3. 本站由 又拍云 提供 CDN 图片存储服务

快速回复 返回顶部 返回列表