4

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

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

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

4

2 回答 2

14

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

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

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

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

于 2013-01-03T15:19:15.353 回答
6

如果代码使用寄存器全局变量,并且没有更新为不使用它,那么它可能是很久以前编写的。这意味着:

  1. 几乎可以肯定存在大量安全漏洞;
  2. 它可能使用已弃用和/或删除的其他 PHP 功能;
  3. 它可能是非常混乱的意大利面条代码,并且
  4. 重写以解决所有问题将是一个婊子。

我的建议是找到一个现代购物车软件包并帮助他使用它来建立他的商店,而不是试图让他现有的古老软件继续运行。这似乎是更多的工作,但从长远来看,对于所有参与其中的人来说,麻烦会少得多。

如果你必须修复他现有的代码(即如果他求你并愿意为你的工作支付很多钱),这里是如何处理寄存器全局变量:

注册全局变量获取输入到 POST 或 GET 参数中的所有变量,并将它们创建为全局命名空间中的简单变量。所以,而不是$_GET['id'],你只是得到$id

如果程序的编写和文档记录得相当好,那么查看它所期望的变量可能并不难。在这种情况下,替换相关变量并不难$_REQUEST;任务完成。

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

如果代码看起来像这样,你将是一个非常勇敢的人来尝试修复它。你应该接受它是无法挽救的,然后走开。过去我有过一些工作,我被要求修复这样的旧代码,相信我,你可以在开始到达某个地方之前投入数月(甚至数年)的时间。在那种时间尺度上,你还不如从头开始编写一个全新的系统。

于 2013-01-03T16:00:24.580 回答