PHP中的$ var而不是$ _GET ['var']?

时间:2009-09-21 22:07:05

标签: php

好的我记不起这方面的细节,但在某些服务器上你可以使用

$ var 而不是 $ _ GET ['var'] 来访问网址中的变量,我知道这很糟糕但是我不记得它为什么坏?

10 个答案:

答案 0 :(得分:8)

我认为你的意思是Register Globals

您不应该使用它们,因为您无法区分该变量值的来源,因为它们可能来自EGPCS变量的任何来源(环境,GET,POST,Cookie,服务器)。

因此,如果您拥有$var,则无法说明该值是来自$_ENV['var']$_GET['var']$_POST['var']$_COOKIE['var']还是{{ 1}}。

答案 1 :(得分:7)

该功能称为Register Globals,它允许人们将变量注入代码中。有关示例,请参阅the documentation;这是一个:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

答案 2 :(得分:2)

如果您的服务器在php.ini文件中将register_globals设置为1(或true),则可以使用它。

在某些时候,默认情况下开始关闭,应用程序开始崩溃,这就是为什么这是一个不好的做法。

您可以看到php.ini变量here的列表。

答案 3 :(得分:1)

这也很糟糕,因为您可以将PHP与变量范围的方式混淆。如果你不小心,你最终可能会覆盖数据。此外,使用$ _GET可以更清楚地了解您要完成的任务。

答案 4 :(得分:1)

因为让人们将值注入任意变量是一件非常糟糕的事情。您可以在那里存储任何内容,它们可能会覆盖一些会危及您安全的价值。在尝试使用之前,请务必使用isset检查是否已设置了值。

答案 5 :(得分:1)

这很糟糕,因为如果你在使用它之前不小心初始化每个变量(PHP不会强迫你做的事情),人们很容易让你的代码做一件非常糟糕的事情请求就像/myapp/index.php?admin_privileges=1

答案 6 :(得分:0)

该设置名为REGISTER_GLOBALS,此处讨论了这个问题:

Why is REGISTER_GLOBALS so bad?

答案 7 :(得分:0)

如果可以这样做,则打开“register_globals”。这很糟糕,因为您不知道变量的来源,并且它将您的变量与任何用户可以通过URL注入的变量混合在一起。在此处阅读更多内容:http://www.php.net/manual/en/security.globals.php

答案 8 :(得分:0)

一旦习惯使用$ _POST,$ _GET等,您的代码的目的将更容易阅读,更容易维护。

答案 9 :(得分:0)

注册全局变量可以工作,但在未来的PHP版本中它是going to go away。更不用说启用它确实是错误的。

您可以使用extract()来控制更受控制的行为。它会将数组中的键(在本例中为$ _GET)作为变量提取到本地上下文中。您可以为它们提供一个公共前缀,以便它们不会与您现有的变量发生冲突。并且您可以预先过滤数组,以确保您只获得预期的变量。

int extract( $var_array [, $type = EXTR_OVERWRITE [, $prefix  ]] )
     

将数组中的变量导入当前符号表。