免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-01-08 18:03 |只看该作者
原帖由 cooldark51 于 2008-1-8 18:01 发表
引用做什么
PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:

这意味着 $a 和 $b 指向了同一个变量。
Note: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 ...



未初始的变量有初始值,但是在使用的时候会出现Notice错误

论坛徽章:
0
32 [报告]
发表于 2008-01-08 18:06 |只看该作者
原帖由 hackfan 于 2008-1-8 17:53 发表

<?php
error_reporting(E_ALL);

$b = &$a;

var_dump(isset($a));
var_dump(isset($b));

?>


你这个测试没任何意义。

isset()未定义的变量和值为NULL的变量都返回false,而不会notice。
和下面的代码结果一样,不能判断出 $b=&$a;的运算结果。

<?php
error_reporting(E_ALL);

var_dump(isset($a));
var_dump(isset($b));

?>

论坛徽章:
0
33 [报告]
发表于 2008-01-08 18:07 |只看该作者
原帖由 hackfan 于 2008-1-8 17:53 发表
我猜是

NULL
Notice : ....
NULL

大家再来看看这个情况:





猜猜看是什么?

我猜是一个notice都不会出现, 都是null

论坛徽章:
0
34 [报告]
发表于 2008-01-08 18:07 |只看该作者
原帖由 super_fire 于 2008-1-8 18:01 发表


在 $b=&a; 中,无论是先给$a赋值,还是先给$b赋值,这都是一个表达式,在PHP脚本的角度看,是一步就执行完了的,不存在先给出notice,再本身赋值的情况。如果先给出notice,那么$a的值不会变,而$b也将是 Undefined variable。


我认为 $b = &$a;
只是建立$a和$b的引用关系,不存在赋值
因此(或者因为)
$b=&$a;
isset($a)的结果为false
也就是说这一步没有所谓的赋值

PHP的等号表达式中不存在 Undefined variable。
PHP在某个变量出 Undefined variable 的notice 后,此变量仍是 Undefined,不会被初始化;而被初始化了的变量是不给notice的。


现在的问题是,没有初始化的变量也不给Notice了!

论坛徽章:
0
35 [报告]
发表于 2008-01-08 18:09 |只看该作者
楼上看我32楼的回复

论坛徽章:
0
36 [报告]
发表于 2008-01-08 18:10 |只看该作者
我承认我在isset上犯了错误

我把isset看得太伟大了^_^

论坛徽章:
0
37 [报告]
发表于 2008-01-08 18:11 |只看该作者
还是那句话,php是弱类型语言,对于这个只是起到编程防错作用.

论坛徽章:
0
38 [报告]
发表于 2008-01-08 18:16 |只看该作者
原帖由 myaxl2008 于 2008-1-8 18:11 发表
还是那句话,php是弱类型语言,对于这个只是起到编程防错作用.


嗯,我们在写程序的时候肯定不会犯这个错误

我是无意间发现这个问题,然后拿上来讨论看看大家的看法

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

咱们站在PHP的角度来分析一下它要怎么做。
1,未初始化的有默认值,所以$b有一个NULL值,而不是 undefined。
2,又因为$b和$a指向同一内容,所以此语句执行完毕后$a的值也是NULL。
4,如果给出notice,则不能给$a赋NULL值,为了赋NULL值,所以就不给notice了。

如果按楼主的逻辑,一定要给出notice的话,那必定要推翻PHP本身的好多特性,$b=&$a;后,要么$b为undefined,要么此语句后 $b的值与$a不同。
那么PHP就不能给未初始化变量默认值了,或者PHP就不存在引用功能了。

论坛徽章:
0
40 [报告]
发表于 2008-01-08 18:37 |只看该作者
原帖由 super_fire 于 2008-1-8 18:24 发表


咱们站在PHP的角度来分析一下它要怎么做。
1,未初始化的有默认值,所以$b有一个NULL值,而不是 undefined。
2,又因为$b和$a指向同一内容,所以此语句执行完毕后$a的值也是NULL。
4,如果给出notice,则 ...


有默认值但是需要给出一个Notice

按照你的逻辑

<?php
$a = $b;
?>

不也一样不应该报Notice吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP