如何在PHP中获取$ _GET变量

时间:2010-11-11 14:05:06

标签: php register-globals

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

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

提前谢谢

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

编辑:我的英语今天太可怕了。正如我在其中一个答案中解释的那样:我需要检查一下,原始程序员是否使用了一些模糊和/或弃用的方法将变量从查询字符串传递到PHP,因此值应用程序现在可以使用错误/未初始化

重要编辑import_request_variables不在桌面上,未使用。所有$_数组也不在桌面上,因为最新的更新不会破坏它们(=>它们仍然可以工作)。如何检测使用register_globals初始化的变量?

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

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

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

5 个答案:

答案 0 :(得分:4)

你的意思是通过Register Globals而不是Magic Quotes ... BTW Register Globals是纯粹的邪恶从不使用它们(从PHP 5.3.0开始它们已被弃用)!

编辑:如果要检查应用程序是否使用了注册全局,请尝试将$_GET值作为变量进行搜索。例如,index.php?id=123尝试在PHP代码中查找$id。如果你发现它并不意味着脚本使用Register Globals,但如果$id来自任何地方并且从未被初始化/设置,那么这是一个好的(坏的!)标志,该​​应用程序使用Register Globals ......

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

$_SERVER["QUERY_STRING"]将为您提供原始GET字符串。

那就是说,这听起来像是一个应该在其根源修复的问题,而不是使用不同的变量。

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

注册Globals是一个糟糕的功能,旧的PHP程序经常依赖它。

启用寄存器全局变量后,PHP将查看GET和POST变量,并将它们“提升”为正常的变量名称 - 例如$_GET['myvar']可以在代码中以$myvar访问。

在其他问题中,这使得黑客只需猜测程序员可能使用的其他变量名称就可以轻松打破程序。因此,默认情况下,注册全局变量功能已被关闭很长时间,现在已被正式弃用,并将在未来版本中完全删除。

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