register_globals修复

时间:2013-01-03 15:12:35

标签: php hosting

我有一个客户,他有一个他希望我主持的网上商店。该站点由另一个开发人员编写并使用寄存器全局变量。

当我将它上传到我的服务器时,它告诉我需要启用register_globals,我检查了.htaccess文件,它是。当我问托管公司时,他们告诉我它已被代表,并且不会在服务器上运行。 我不确定代码的哪些部分依赖于它,因为我没有仔细研究编程,我只打算主持它。

是否有快速解决方法,或者我是否需要拆开代码并使用最新的替代方案进行修复?

2 个答案:

答案 0 :(得分:13)

一个真正丑陋但非常快速的修复方法如下:

foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_SG) {
    foreach ($$_SG as $_SGK => $_SGV) {
        $$_SGK = $_SGV;
    }
}

最好在任何可以执行的php脚本的顶部,在任何其他代码之前。

请注意,这不是我真正推荐的。请尝试说服您的客户,他们应该得到更好的东西。如果代码需要register_globals,那么它可能就像地狱一样不安全......

答案 1 :(得分:6)

如果代码使用了注册全局变量,并且尚未更新为不使用它,那么很可能是很久以前写的。这意味着:

  1. 几乎可以肯定会有大量的安全漏洞;
  2. 它可能使用已弃用和/或删除的其他PHP功能;
  3. 这可能是非常凌乱的意大利面条代码,
  4. 重写以解决所有问题将成为一个婊子。
  5. 我的建议是找到一个现代购物车软件包,并帮助他使用它来设置他的商店,而不是试图保持他现有的古老软件运行。看起来似乎更多的工作,但从长远来看,对于每个参与者来说,这都会减少麻烦。

    如果你必须修复他现有的代码(即如果他恳求你并且愿意为你的工作付出很多代价),那么这里是如何处理注册全局的:

    注册globals将输入的所有变量放入POST或GET参数中,并在全局命名空间中将它们创建为简单变量。因此,您只需$_GET['id']而不是$id

    如果程序编写得很合理并且有文档记录,那么看到它预期的变量可能并不难。在这种情况下,为相关变量替换$_REQUEST并不困难;完成工作。

    但是很多(呃,大多数)旧的PHP代码只是抛出全局变量而没有过多地关注它们。在网站中放入一堆包含数百行代码但没有function()声明的代码,以及交织的PHP和HTML代码,可能会生成一些生成Javascript的内容,而且您经常会遇到一个对任何人都完全无法访问的混乱除了原作者(有时甚至不是他们)。

    如果代码看起来像这样,你将是一个非常勇敢的人试图修复它。你应该接受它是不可救药的,然后走开。我曾经有过工作,我被要求修复这样的旧代码,相信我,你可以在开始到达某个地方之前花费几个月(甚至几年)的时间。在这种时间尺度上,您可能已经从头开始编写了一个全新的系统。