我有一个客户,他有一个网上商店,他希望我来主持。该站点由另一个开发人员编写,并使用了寄存器全局变量。
当我将它上传到我的服务器时,它告诉我它需要启用register_globals,我检查了.htaccess文件,它是。当我询问托管公司时,他们告诉我它已经被删除了,不能在服务器上运行。我不确定代码的哪些部分依赖于它,因为我没有太仔细地研究程序,我只是打算托管它。
有没有快速修复的方法,或者我必须把代码拆开,然后用最新的替代方案来修复它?
发布于 2013-01-04 00:00:25
如果代码使用了寄存器全局变量,并且没有更新到不使用它,那么它可能是很久以前编写的。这意味着:
<代码>G29
我的建议是找到一个现代购物车软件包,并帮助他建立自己的商店使用,而不是试图保持他现有的古老的软件运行。这可能看起来像是更多的工作,但从长远来看,对于参与其中的每个人来说,这将是更少的麻烦。
如果你必须修复他现有的代码(例如,如果他向你求情,并提出为这项工作支付你很多钱),这里是如何处理注册全局变量的:
Register globals接受所有输入到POST或GET参数中的变量,并将它们创建为全局名称空间中的简单变量。所以你得到的是$id,而不是$_GET['id']。
如果程序的编写和文档编制得相当好,那么就不难看出它所期望的变量是什么。在这种情况下,不难怀疑相关变量的$_REQUEST;工作完成了。
但是许多(嗯,大多数)旧的PHP代码只是抛出全局变量,而没有太多关注它们。在站点中加入一堆includes、成百上千行没有function()声明的代码,以及交织在一起的PHP和HTML代码,可能还会加上一些生成Javascript的代码,你通常会得到一个除了原始作者之外的任何人都无法理解的混乱(有时甚至连他们自己也不能理解)。
如果代码看起来像这样,你将是一个非常勇敢的人来尝试修复它。你应该接受它是不可挽回的,然后离开。我在过去的工作中曾被要求修复像这样的旧代码,相信我,在你开始取得进展之前,你可以投入几个月(甚至几年)的时间。在这样的时间尺度下,你就像是从头开始写了一个全新的系统。
发布于 2013-01-03 23:19:15
一个非常难看但非常快速的修复方法如下所示:
foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_SG) {
foreach ($$_SG as $_SGK => $_SGV) {
$$_SGK = $_SGV;
}
}优选地,在任何其它代码之前,位于可被执行的任何php脚本的顶部。
请注意,这不是我真正推荐的东西。请试着说服你的客户,他们应该得到更好的东西。如果代码需要register_globals,很可能它就像地狱一样不安全……
https://stackoverflow.com/questions/14141631
复制相似问题