免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-01-07 23:37 |只看该作者

回复 #10 showsa 的帖子

也就是说引用会给未初始化的变量赋默认值

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
12 [报告]
发表于 2008-01-08 09:27 |只看该作者
原帖由 hackfan 于 2008-1-7 23:37 发表
也就是说引用会给未初始化的变量赋默认值


在参数传递过程中,不是引用会给未初始化的变量赋默认值。
而是任何一个没有初始化的变量,你使用的时候,它会有一个NULL值。当然,你如果把它本身去做运算的话,他会根据运算自动做类型转换,例如转换为0;
现在你传递的是引用,引用不是对这个变量的引用,而是对它的内容的引用。
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。

在你前面的传递的过程中,会使用一个没有初始化的变量,它有值NULL,当调用结束后,PHP自己会根据你的使用,来决定他是否有用从而选择保留还是去掉。

例如非引用的传递:(如果是你前面的引用的话,那么变量对应的内容发生了变化,而且是有效的,那就保留下来了)

  1. function a($a)
  2. {
  3.         $a++;
  4.         echo($a);
  5. }
  6. a($b);
  7. echo($b);
复制代码

内部的$a我这边测试不报错。

论坛徽章:
0
13 [报告]
发表于 2008-01-08 11:28 |只看该作者
原帖由 HonestQiao 于 2008-1-8 09:27 发表


在参数传递过程中,不是引用会给未初始化的变量赋默认值。
而是任何一个没有初始化的变量,你使用的时候,它会有一个NULL值。当然,你如果把它本身去做运算的话,他会根据运算自动做类型转换,例如转换为0 ...



首先要确保

error_reporting(E_ALL);

这个前提下,你的程序

<?php
error_reporting(E_ALL);

function a($a)
{
        $a++;
        echo($a);
}
a($b);
echo($b);
?>

在PHP CLI下运行结果:

PHP Notice:  Undefined variable: b in E:\a.php on line 9
1PHP Notice:  Undefined variable: b in E:\a.php on line 10

也就是说,读操作不会给变量赋初始值!

以上结论我已说明过

论坛徽章:
0
14 [报告]
发表于 2008-01-08 11:29 |只看该作者
再贴一个程序,以避免没看懂我的结论:

<?php
error_reporting(E_ALL);

for($i=0;$i<=20;$i++)
        echo $a;
?>

结果:

PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5
PHP Notice:  Undefined variable: a in E:\a.php on line 5

论坛徽章:
0
15 [报告]
发表于 2008-01-08 11:31 |只看该作者
所以,

而是任何一个没有初始化的变量,你使用的时候,它会有一个NULL值。当然,你如果把它本身去做运算的话,他会根据运算自动做类型转换,例如转换为0;
现在你传递的是引用,引用不是对这个变量的引用,而是对它的内容的引用。


使用的时候,的确会认为他的值为0,但是不会保存到变量中去!

为什么一旦对变量进行引用,变量自动被初始化呢?

<?php
error_reporting(E_ALL);

$b = &$a;

for($i=0;$i<=20;$i++)
        echo $a;
?>

结果:
无报错

E:\>c:\php\php a.php

E:\>

论坛徽章:
0
16 [报告]
发表于 2008-01-08 13:36 |只看该作者
这也叫漏洞?如果不引用呢?

  1. function A($a) {
  2.         echo $b;
  3. }
  4. A($a);

  5. /*
  6. [Tue Jan 08 13:41:29 2008] [error] [client 127.0.0.1] PHP Notice:  Undefined variable: a in E:\\ThinkPHP\\Hello\\www\\test.php on line 12
  7. [Tue Jan 08 13:41:29 2008] [error] [client 127.0.0.1] PHP Notice:  Undefined variable: b in E:\\ThinkPHP\\Hello\\www\\test.php on line 10
  8. */
复制代码

php是弱类型语言,建议去看C的基础知识.

[ 本帖最后由 myaxl2008 于 2008-1-8 13:45 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-01-08 13:44 |只看该作者
我发现他是砸场子的.

论坛徽章:
0
18 [报告]
发表于 2008-01-08 13:46 |只看该作者
原帖由 hqnpc 于 2008-1-8 13:44 发表
我发现他是砸场子的.

同感.

论坛徽章:
0
19 [报告]
发表于 2008-01-08 13:49 |只看该作者
楼上2位没认真看

在引用的时候(姑且看作是另类写操作吧),如果发现变量没有初始化,确实会给他们初始化为NULL

论坛徽章:
0
20 [报告]
发表于 2008-01-08 16:24 |只看该作者
原帖由 hackfan 于 2008-1-8 11:28 发表
...
也就是说,读操作不会给变量赋初始值!...


<?php
error_reporting(E_ALL);
$b = &$a;

echo $b;
var_dump($a);
var_dump($b);
?>

上面的代码没提示,那么这样解释就解释通了。

1,对一个变量的读操作是不能给此变量赋值的,这个大家都同意。
2,引用(如$b=&a;) 实际上是给 $b 赋值了,而因为$a没有值,所以给了$b一个NULL。
3,又因为相互引用的两个变量是指向同一内容的,所以变量 $a 也指向了 $b 的内容,所以 $a 也有了NULL 值。

不知道这样解释,能否统一各方的意见?


$a = 10;
$b = &$a;
unset($a);
echo $b;  //10

[ 本帖最后由 super_fire 于 2008-1-8 16:27 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP