免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10621 | 回复: 45
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-05 22:04 |只看该作者 |倒序浏览
发现PHP引用存在漏洞

测试代码如下:

<?php

function foo(&$var)
{
&nbsp;&nbsp;&nbsp;&nbsp;$var++;
}

echo $a;

foo($a);

echo $a;

?>


运行结果

Notice: Undefined variable: b in /var/htdocs/test.php on line 6
1


测试环境:
PHP 5.2.4

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2008-01-05 23:06 |只看该作者
原帖由 hackfan 于 2008-1-5 22:04 发表
发现PHP引用存在漏洞

测试代码如下:



运行结果



测试环境:
PHP 5.2.4



1. 在 PHP 中并不需要初始化变量,未初始化的变量具有其类型的默认值 - FALSE,零,空字符串或者空数组。
2.

  1. <?php

  2. function foo(&$var)
  3. {
  4.         isset($var) or die('no set');
  5.     $var++;
  6. }

  7. echo $a;

  8. foo($a);

  9. echo $a;

  10. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-01-06 21:33 |只看该作者
如果按照您所说的

那应该报2个Notice错误而不是一个

测试以下代码:

<?php

echo $a;

$a++;

echo $a;

?>

论坛徽章:
0
4 [报告]
发表于 2008-01-06 21:36 |只看该作者
上面兄弟已经发了。俺就删了。

[ 本帖最后由 super_fire 于 2008-1-6 21:39 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-01-06 21:46 |只看该作者
经过以下程序测试,证明是引用的问题

<?php
error_reporting(E_ALL);

function foo()
{
&nbsp;&nbsp;&nbsp;&nbsp;global $a;
&nbsp;&nbsp;&nbsp;&nbsp;$a++;
}

echo $a;
foo();
echo $a;

echo "\n\nSeparator\n\n";

function bar()
{
&nbsp;&nbsp;&nbsp;&nbsp;$GLOBALS['b']++;
}

echo $b;
bar();
echo $b;


?>


第一个函数调用报1个Notice错误

而第二个函数调用报了2个Notice错误

原因是

global $a;

等价于

$a = & $GLOBALS['a'];

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2008-01-07 21:51 |只看该作者
原帖由 hackfan 于 2008-1-6 21:46 发表
经过以下程序测试,证明是引用的问题



第一个函数调用报1个Notice错误

而第二个函数调用报了2个Notice错误

原因是

global $a;

等价于

$a = & $GLOBALS['a'];

引用做什么
PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
<?php
$a =& $b;
?>
这意味着 $a 和 $b 指向了同一个变量。
Note: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。

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


Example#1 未初始化变量的默认值

<?php
echo ($unset_bool ? "true" : "false"); // false
$unset_int += 25; // 0 + 25 => 25
echo $unset_string . "abc"; // "" . "abc" => "abc"
$unset_array[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
?>

依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中时碰上相同的变量名。另外把 register_globals 打开是一个主要的安全隐患。E_NOTICE 级别的错误会在碰上未初始化的变量时发出,但是在向一个未初始化的数组附加单元时不会。isset() 语言结构可以用来检测一个变量是否已被初始化。


你可以测试:

  1. $a = &$b;
  2. $a++;
  3. print_r($a);
  4. print_r($b);
复制代码


因为:
NULL
特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。

Note: NULL 类型是 PHP 4 引进的。

在下列情况下一个变量被认为是 NULL:

被赋值为 NULL。

尚未被赋值。

被 unset()。


任何一个变量,即使没有先前赋值,如果使用使用了,他会有一个默认的NULL值;使用引用传递的时候,实际传递的是指向这个NULL值,而不是那个变量。

论坛徽章:
0
7 [报告]
发表于 2008-01-07 22:13 |只看该作者
乔。。
小猪拜上

论坛徽章:
0
8 [报告]
发表于 2008-01-07 22:27 |只看该作者
原帖由 HonestQiao 于 2008-1-7 21:51 发表




你可以测试:

$a = &$b;
$a++;
print_r($a);
print_r($b);


因为:


任何一个变量,即使没有先前赋值,如果使用使用了,他会有一个默认的NULL值;使用引用传递的时候,实际传递的是指向这 ...



<?php
error_reporting(E_ALL);

echo $a;

echo $a;


?>


如果是用到以后就被赋NULL

那么以上代码为何报2个Notice而不是1个?


以上代码证明:未初始化的变量,读操作报Notice,写操作报Notice并且对其赋默认值并运算。


那么请解释:

<?php
error_reporting(E_ALL);

echo $a;

$a++;

?>

报2个Notice



<?php
error_reporting(E_ALL);

echo $a;

$b = &$a;

$b++;

?>


只报一个?

甚至

<?php
error_reporting(E_ALL);

echo $a;

$b = &$a;

$a++;

?>


也只报一个?

这个解释不通。

[ 本帖最后由 hackfan 于 2008-1-7 22:29 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-01-07 22:34 |只看该作者

回复 #6 HonestQiao 的帖子

我明白引用是什么,引用有什么用

只是突然发现这么一个奇怪的现象,拿出来跟大家讨论

可能得翻PHP源代码才能找到答案了

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

  1. <?php

  2.     error_reporting(E_ALL);

  3.     $b = &$a;

  4.     echo $a;

  5.     echo $b;

复制代码


这样你会发现没有任何报错

这里= &操作发现 a,b 都没有复制,于是都给他们NULL

见证如下


  1. <?php

  2.     error_reporting(E_ALL);

  3.     $b = &$a;

  4.     var_dump($a); // or $b


复制代码


输出结果为NULL

于是上面hackfan所得到的结果就可以解释清楚了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP