免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-01-08 17:03 |只看该作者
楼上的,

2,引用(如$b=&a;) 实际上是给 $b 赋值了,而因为$a没有值,所以给了$b一个NULL。

因为$a没有值,PHP在读取$a的时候发现$a没有值,是否应该先抛出一个Notice呢?
然后再把NULL赋给$b


现在的设计有点匪夷所思,所以我认为这是一个缺陷。

论坛徽章:
0
22 [报告]
发表于 2008-01-08 17:07 |只看该作者
另外:请问我砸场子的动机是什么?

我只是发现这个问题欣喜地上CU来寻求探讨,没有别的意思

只是目前的回答不能把我说服,让我认为这样设计是合理的,没有争议的

我手头也有很多事情,所以没有时间去深究PHP的源代码,有兴趣的朋友欢迎继续探讨

论坛徽章:
0
23 [报告]
发表于 2008-01-08 17:23 |只看该作者
提交BUG

论坛徽章:
0
24 [报告]
发表于 2008-01-08 17:30 |只看该作者

论坛徽章:
0
25 [报告]
发表于 2008-01-08 17:47 |只看该作者
原帖由 hackfan 于 2008-1-8 17:03 发表
楼上的,

2,引用(如$b=&a;) 实际上是给 $b 赋值了,而因为$a没有值,所以给了$b一个NULL。

因为$a没有值,PHP在读取$a的时候发现$a没有值,是否应该先抛出一个Notice呢?
然后再把NULL赋给$b


现 ...


又测试了一下,发现PHP在引用某个变量的时候,如果此变量未初始化,则会给个NULL,相当于 " $a = NULL; $b = $a; " 不给出notice。
可能在PHP看来,引用操作是一定要返回内容的,检查$a无值后,直接把$a初始化后为NULL,然后返回给$b。
那么上面的2中,应该是先给$a赋的值,再把内容返回给$b。

而赋值操作中 $b = $a; 因为$b的值可以与$a不同,所以给$b初始化为NULL,而$a的内容保持不变。

猜猜下面代码会提示什么?

<?php

define('A', &$a);
var_dump(A);

$b = $c;
var_dump($b);

?>

论坛徽章:
0
26 [报告]
发表于 2008-01-08 17:53 |只看该作者
我猜是

NULL
Notice : ....
NULL

大家再来看看这个情况:



<?php
error_reporting(E_ALL);

$b = &$a;

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

?>

猜猜看是什么?

论坛徽章:
0
27 [报告]
发表于 2008-01-08 17:55 |只看该作者
我猜测会不会是在对变量做运算操作的时候才会初始化, 而要显示该变量的时候, 实际只是要显示它指向的内容, 也就是这个变量指向的地址包含的东西....

论坛徽章:
0
28 [报告]
发表于 2008-01-08 17:58 |只看该作者
问题很明显了:

<?php
error_reporting(E_ALL);

$b = &$a;

if( isset($a) === false )
{
        $a++;
        echo $a;
}
else
{
        echo 'Hello';
}
?>

显示

1

论坛徽章:
0
29 [报告]
发表于 2008-01-08 18:01 |只看该作者
原帖由 hackfan 于 2008-1-8 17:03 发表
2,引用(如$b=&a;) 实际上是给 $b 赋值了,而因为$a没有值,所以给了$b一个NULL。
因为$a没有值,PHP在读取$a的时候发现$a没有值,是否应该先抛出一个Notice呢?
然后再把NULL赋给$b

现 ...


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

[ 本帖最后由 super_fire 于 2008-1-8 18:07 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2008-01-08 18:01 |只看该作者
引用做什么
PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
<?php
$a =& $b;
?>
这意味着 $a 和 $b 指向了同一个变量。
Note: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。

虽然在 PHP 中并不需要初始化变量,但这是个好习惯。未初始化的变量具有其类型的默认值 - FALSE,零,空字符串或者空数组。

个人觉得这个是关键的地方
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP