好的我记不起这方面的细节,但在某些服务器上你可以使用
$ var 而不是 $ _ GET ['var'] 来访问网址中的变量,我知道这很糟糕但是我不记得它为什么坏?
答案 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
,此处讨论了这个问题:
答案 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 ]] )
将数组中的变量导入当前符号表。