PHP $_GET['X'] 默认$X



我一直在自学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,则无论您是否是管理员,都可以访问网站的管理部分。

相关内容

  • 没有找到相关文章

最新更新