2010-11-11 88 views
3

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

我想问:(?如直接的方法)什么是访问$_GET变量,而无需使用$_GET[]阵列不同的方式如果知道,我该如何检查这个应用程序是否使用其中的任何一个?

预先感谢您

编辑:我记得在很多其他方面都register_globals,不magic_quotes。另外,我不希望使用它,而如果使用,并在最新的服务器更新弃用它检测(什么可以解释为什么应用程序停止正常工作)

编辑:我的英语今天是可怕的。正如我在回答一个解释:我需要检查,原来的程序是否使用正从查询字符串变量到PHP的一些模糊的和/或方法已过时,因此它们的值应用现在都错/未初始化工作

重要编辑import_request_variables不在表中,因此未使用。所有$_数组也不在场,因为最新的更新不会破坏它们(=>它们仍然有效)。如何检测用register_globals初始化哪些变量?

又一编辑:我发现这一点:(最多1个星期前)

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

莫非已经通过最新更新一个破?

+4

我们有关系吗? – 2010-11-11 14:11:40

+0

它会给出某种错误吗?如果没有,那么它不起作用。在我们诊断问题之前,我们需要知道。 – 2010-11-11 14:12:27

+0

我也会认为他宁愿用'register_globals'或PHP3数组''HTTP_GET_VARS'来代替。无论哪种方式都不好。努力重写这些东西。 – mario 2010-11-11 14:13:35

回答

4

您的意思是通过Register Globals而不是Magic Quotes ...顺便说一句注册Globals是纯粹的邪恶从来没有使用它们(并且它们从PHP 5.3.0开始已弃用)!

编辑:如果您想检查应用程序是否使用了Register Globals,请尝试搜索$_GET值作为变量。例如对于index.php?id=123,请尝试在PHP代码中查找$id。如果您发现这并不意味着脚本使用了注册全局变量,但是如果$id来自无处,并且从未初始化/设置它是一个很好的(坏的)符号,该应用程序使用注册全局变量...

+0

我仍然不确定用例是什么...... – cwallenpoole 2010-11-11 14:13:27

+0

@Christopher W. Allen-Poole注册Globals对于任何真正的程序员来说都是毫无用处的。他们是PHP历史上最大的WTF。我猜他们是为了帮助非程序员构建带有安全漏洞的应用程序;) – AlexV 2010-11-11 14:16:21

+0

嗯,我不使用它们,也从来没有 - 我记得几年前我在某些PHP书中读到的第一件事 - **不使用'register_globals' **,所以我从不关心它。也许我应该有。 – 2010-11-11 14:19:07

2

您也有$_REQUEST,magic_quotes(不建议使用)只会影响变量的内容,而不会影响变量的内容。

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

2

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

这就是说,这听起来像一个问题,应该固定在它的根,而不是使用一个不同的变量。

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

PHP手册中的页面显示了一种根据功能是否激活来“修复”传入数据的方法。对于大量数据来说效率不高,但应该在日常任务中完成。

+0

这个问题是糟糕的措辞(我今天真的很累^ _ ^) - 我需要检查,原始程序员是否使用了一些模糊的和/或不赞成使用的方法从查询字符串中获取变量到PHP。 – 2010-11-11 14:16:15

+0

@Adam现在register_globals在桌面上,我的答案可能不适用。没关系。尽管如此,修复根本原因的基本建议仍然有效:)虽然这可能需要很多工作。 – 2010-11-11 14:17:16

1

问题是大概是PHP's register_globals。此选项会自动将$_GET['some_var']或其等效$_POST版本作为$some_var提供。这是弃用的,你绝对不应该使用它,但其他程序员可能已经在该应用程序中使用它们。

1

注册Globals是一个可怕的功能,老的PHP程序通常依赖。

随着注册全局变量开启,PHP将查看GET和POST变量并将它们“提升”为正常的变量名 - 例如$_GET['myvar']将可在代码中作为$myvar访问。

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

因为用这种方式使用的变量是以与普通变量无法区分的方式引用的,这意味着尝试更新使用注册全局变量的旧代码可能非常困难。它的确取决于编写代码的程度。