3

我正在研究几年前构建的应用程序,该应用程序最近停止正常工作。老程序员说,他可能正在访问$_GET$_POST变量而不是从中读取它们$_GET[] array,而是通过register_globals

我想问:在$_GET不使用数组的情况下访问变量有哪些不同的方法$_GET[](例如直接方法?),如果知道,我如何检查这个应用程序是否使用它们中的任何一个?

先感谢您

编辑:我记得的其他方式是register_globals,不是magic_quotes。另外,我不想使用它,而是检测它是否被使用并且在最新的服务器更新中已弃用(什么可以解释为什么应用程序停止正常工作)

编辑:我今天的英语很糟糕。正如我在一个答案中解释的那样:我需要检查原始程序员是否使用了一些晦涩和/或不推荐使用的从查询字符串获取变量到 PHP 的方法,因此现在使用的值应用程序是错误的/未初始化

重要编辑import_request_variables不在桌面上,未使用。所有$_数组也都不在讨论范围内,因为最新的更新不会破坏它们(=>它们仍然有效)。如何检测哪些变量被初始化register_globals

另一个编辑:我发现了这个:

foreach ($_POST as $k => $v) {
  eval("\$".$k." = '".$v."';");
}
foreach ($_GET as $k => $v) {
  eval("\$".$k." = '".$v."';");
}

它是否已被最新更新之一(最多 1 周前)破坏?

4

5 回答 5

4

你的意思是通过注册全局变量而不是魔术引号......顺便说一句,注册全局变量是纯粹的邪恶永远不要使用它们(并且从 PHP 5.3.0 开始不推荐使用它们)!

编辑:如果要检查应用程序是否使用了 Register Globals,请尝试搜索$_GET值作为变量。例如index.php?id=123尝试$id在 PHP 代码中查找。如果您找到它,这并不意味着该脚本使用了 Register Globals,但如果$id从无处获得并且从未初始化/设置,则表明该应用程序使用 Register Globals 是一个好(坏的!)迹象......

于 2010-11-11T14:09:03.590 回答
2

您还有$_REQUESTmagic_quotes(已弃用)只会影响变量的内容,而不是捕获它们的方式。

另请参阅import_request_variables,原始编码器可能已使用它来获取 GET 变量的内容并将其插入到随后被引用的另一个变量中。

于 2010-11-11T14:07:18.157 回答
2

$_SERVER["QUERY_STRING"]会给你原始的 GET 字符串。

也就是说,这听起来像是一个应该从根本上解决的问题,而不是使用不同的变量。

如果魔术引号是一个问题,请检查它们是否已启用,并相应地处理传入的数据。

PHP 手册中的Disabling Magic Quotes页面显示了一种根据功能是否激活来“修复”传入数据的方法。对于大量数据,它不是很有效,但应该在日常任务中使用。

于 2010-11-11T14:08:40.720 回答
1

问题可能是PHP 的register_globals. 此选项使$_GET['some_var']或它们的等效$_POST版本$some_var自动可用。这已被弃用,您绝对不应该使用它,但其他程序员可能在该应用程序中使用过它们。

于 2010-11-11T14:11:27.283 回答
1

Register Globals 是旧的 PHP 程序经常依赖的一个可怕的特性。

打开寄存器全局变量后,PHP 将查看 GET 和 POST 变量并将它们“提升”为普通变量名称 - 例如$_GET['myvar'],可以在代码中以$myvar.

除其他问题外,这使得黑客很容易通过猜测程序员可能使用的其他变量名称来破解程序。因此,注册全局功能已默认关闭很长时间,现已正式弃用,并将在未来版本中完全删除。

因为以这种方式使用的变量的引用方式与普通变量无法区分,这意味着尝试更新使用寄存器全局变量的旧代码可能非常困难。这在很大程度上取决于代码编写的好坏。

于 2010-11-11T14:25:36.657 回答