免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: hackfan
打印 上一主题 下一主题

发现PHP引用存在漏洞 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-01-08 19:28 |只看该作者
<?php
$a = $b;
?>

中$a = $b; 之后,$b仍然是 undefined.

而$a = &$b; 中却不然。

论坛徽章:
0
42 [报告]
发表于 2008-01-08 22:15 |只看该作者
那为什么一个报Notice
一个不报?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
43 [报告]
发表于 2008-01-09 10:24 |只看该作者
原帖由 hackfan 于 2008-1-8 22:15 发表
那为什么一个报Notice
一个不报?


我已经给你看了PHP的C源代码了,在作为引用操作的时候,处理方式是有变化的。
有些东西,如果深究,就非要去看深层的处理机制了。

论坛徽章:
0
44 [报告]
发表于 2008-01-09 12:42 |只看该作者
原帖由 HonestQiao 于 2008-1-9 10:24 发表


我已经给你看了PHP的C源代码了,在作为引用操作的时候,处理方式是有变化的。
有些东西,如果深究,就非要去看深层的处理机制了。


从设计上说,Notice提示的目的就在于帮助开发者避免使用未经初始化的变量

那么在处理引用时,也应该考虑到这个情况

所以我认为这是一个缺陷而不是处理方式有变化

论坛徽章:
0
45 [报告]
发表于 2008-01-09 16:04 |只看该作者
在php中,对于变量,除了保存了它的值,还保存了一个变量列表。

为了看得清楚些我写了下面的代码:


  1. <?php
  2. echo "<pre>";
  3. $arr = get_defined_vars();
  4. print_r($arr);
  5. echo "<br />------------------------------------------------------------------------------------------<br />\r\n";

  6. echo "<br />At 1st var_dump a is: ";
  7. echo "<br />---a 1st var_dump start---<br />\r\n";
  8. var_dump ($a);
  9. echo "<br />---a 1st var_dump end-----<br />\r\n";

  10. echo "<br />------------------------------<br />\r\n";
  11. echo "<br />-----echo test------<br />\r\n";
  12. echo "<br />---echo 1st start---<br />\r\n";
  13. echo $a;
  14. echo "<br />---echo 1st end-----<br />\r\n";


  15. $b=&$a;
  16. echo "<br />---echo 2nd start---<br />\r\n";
  17. echo $a;
  18. echo "<br />---echo 2nd end-----<br />\r\n";
  19. echo "<br />------------------------------<br />\r\n";

  20. echo "<br />Now var_dump a is: ";
  21. echo "<br />---a 2nd var_dump start---<br />\r\n";
  22. var_dump ($a);
  23. echo "<br />---a 2nd var_dump end-----<br />\r\n";

  24. $a2=null;
  25. echo "<br />---a2 var_dump start---<br />\r\n";
  26. var_dump ($a2);
  27. echo "<br />---a2 var_dump end-----<br />\r\n";

  28. echo "<br />------------------------------------------------------------------------------------------<br />\r\n";
  29. $arr = get_defined_vars();
  30. print_r($arr);
  31. echo "<br />------------------------------------------------------------------------------------------<br />\r\n";
  32. foreach ($arr as $value) {
  33.     var_dump ($value);
  34.     echo "<br />\r\n";
  35. }
  36. ?>
复制代码


运行结果:
(一大坨东西)
------------------------------------------------------------------------------------------

At 1st var_dump a is:
---a 1st var_dump start---

Notice: Undefined variable: a in D:\usr\www\localhost\public_html\2.php on line 5
NULL
---a 1st var_dump end-----

------------------------------

-----echo test------

---echo 1st start---

Notice: Undefined variable: a in D:\usr\www\localhost\public_html\2.php on line 11

---echo 1st end-----

---echo 2nd start---

---echo 2nd end-----

------------------------------

Now var_dump a is:
---a 2nd var_dump start---
NULL
---a 2nd var_dump end-----

---a2 var_dump start---
NULL
---a2 var_dump end-----

------------------------------------------------------------------------------------------
(一大坨东西,注意中间 [a] => ,注意最下面,有三个NULL)


当变量$a未被赋值时,变量列表中当然找不到这个$a,那么当函数或表达式等取$a的值时,会抛出一个Notice,并返回默认的值:NULL
当变量被引用时,会被自动给$a赋一个NULL (此举为了满足条件:引用的必须为变量,这或许可以看做一种隐式类型转换),此时变量列表中已经有$a,当取$a的值时返回的是实实在在的NULL
所以那一大坨东西里面三个NULL有一个就是$a的。

同理,当NULL遇到++时,又是一次隐式类型转换,变成0,然后++,就变作1了

论坛徽章:
0
46 [报告]
发表于 2008-01-10 11:16 |只看该作者
HOHO,都  是强淫啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP