我一直在自学PHP,我使用了一个web主机帐户来测试我的脚本,默认情况下,它们会打开register_globals。我知道这是不安全的,但我在测试示例代码时并没有烦恼。
现在,我正在为我所属的一个非营利组织开发一个小型实时网站,他们使用的主机默认情况下关闭了register_globals,这是应该的。
所以,现在是我的问题。我已经习惯了这种工作(打开register_globals):
假设我们正在加载index.php?pID=1.index.php的代码将包含此行:
if($pID==1) include('content1.php');
请注意,我使用了$pID,而不是$_GET['pID'],并且在代码中的任何位置都没有将$_GET['pID']分配给$pID。无论如何,这一切都很顺利。所以(当然)我想知道,当我在我的orgs主机上使用相同的代码时,这是否是因为register_globals关闭了,所以突然不起作用了?
如果是这样的话,是否有办法让超级全局变量再次变魔术,或者我是否必须手动将所有$_GET变量分配给我自己的全局变量?
不要尝试实现register_globals
,这是一个巨大的安全漏洞,根本不应该实现。因此,它在PHP 5.3中被弃用,在PHP 5.4中被删除。
您不需要重新分配变量,只需将它们替换为等效的$_GET
即可。即
if($pID==1) include('content1.php');
应该成为
if($_GET['pID']==1) include('content1.php');
为了证明register_globals
为什么不好,我们来看看这个简化的例子:
if(login_success('admin')) {
$admin = 1;
}
if($admin == 1) {
require('super-secret-admin-file.php');
}
因为$admin
从不在任何地方初始化,所以如果register_globals
处于打开状态并且您打开了file.php?admin=1
,则无论您是否是管理员,都可以访问网站的管理部分。