2

我刚刚发现修改了一个由其他人开发的现有网站。

在对 PHP 文件进行更改时,我注意到未声明的变量(甚至在包含的文件中也没有)被成功使用。

我无法理解这是如何做到的。是否使用了 PHP 的魔法方法(_get 和 _set)?

一个示例场景是这样的。

<?php
    if($name != ""){
        //do process
    }
?>

<form method="POST">
    <input type="hidden" name="name" value="" />
</form>

在正常情况下,上面的代码会为未定义的变量抛出错误。我还可以看到,上面的所有变量主要用于隐藏输入或 $_GET 变量。

但是上面的代码在我正在开发的站点中工作得很好,即使 $name 变量没有被分配给 $_POST['name'] 或 $_REQUEST...

谁能建议一种在 PHP 中做这样的事情的方法,或者我在这里遗漏了什么。

4

2 回答 2

1

在旧版本的 PHP 中,您设置register_globals并因此将$_REQUEST数组的所有元素(以及相应的$_POST$_GET)隐式转换为这样的变量。

但是,从 5.4 版开始,此功能已被删除,因为它会导致混淆和可能的安全风险,因为如果您没有正确初始化它们,用户可能会在您的脚本中注入变量。

因此,例如,如果$_POST数组看起来像这样

$_POST = array ( 'myVar' => 1, 'myOtherVar' => 2 );

PHP 上的 withregister_globals生成了两个额外的变量,如下所示:

$myVar == 1
$myOtherVar == 2

参考:

于 2013-06-04T13:07:03.097 回答
1

我宁愿检查你的php.ini是否register_global开启。这将允许在不声明变量的情况下存储变量,所有变量都($_POST, $_GET ..)将自动转换为变量。

这是一种不好的做法,可能会导致严重的安全问题。我想让你检查这个有用的帖子

为什么 REGISTER_GLOBALS 如此糟糕?

于 2013-06-04T13:07:23.907 回答