0

我一直在自己学习 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 变量分配给我自己的全局变量?

4

1 回答 1

0

不要尝试实施register_globals,这是一个巨大的安全漏洞,一开始就不应该实施。这就是为什么它在 PHP 5.3 中被弃用并在 PHP 5.4 中被删除的原因。

您不需要重新分配变量,只需将它们替换为$_GET等价物。IE

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,无论您是否是管理员,您都可以访问该站点的管理部分。

于 2013-07-25T14:57:33.727 回答