我有一个相当大的php站点,它是为php4编写的,并启用了register_globals。这是旧的自定义CMS。现在我想在没有register_globals的php5主机上运行它。是否可以使用一些脚本自动将参数解析从$id更改为$_GET["id"]?
我可以在这个网站上从wget -r
获取参数名称。
它有几十个php脚本,手动更改并不容易。
PS:更新:我只想转换GET变量。每个参数的附加行为$var_name = $_GET["var_name"]
。这一行应该插入脚本的很高位置,例如在最顶部添加一个新的<? ?>
部分。
运行这样的工具会带来在代码中引入错误的巨大风险。
我建议在superglobals上运行extract(),这样就可以强制register_globals和应用程序正常工作。
http://php.net/manual/pl/function.extract.php
接下来,当一切正常时,为输入参数编写一个OO包装器,将其打包到漂亮的DI容器中,并开始手动将整个脚本转换为新样式。
我不知道有什么工具可以帮助您进行转换,但您有几个选择:
- 通过执行register_globals所做的相同操作来模拟register_global:在脚本开始时,将GET和POST中的所有变量放入全局变量命名空间(即通过
extract
)。虽然这是最快、最简单的解决方案,但它会导致register_globals众所周知的安全问题,而且对应用程序的性能没有帮助 - 确定所使用的变量,并仅通过init脚本将其加载到$GLOBALS中。还是不太好
- 确定使用的变量,并用REQUEST替换GLOBALS用法
- 手动浏览。这样,你就可以确保一切都是正确的,并且之后麻烦最小
根据您的描述,解决方案1或2可能是最适合您的,因为cms似乎无论如何都没有更新(这很遗憾)。
尽管实际的查找/替换可能需要更多的时间,但手动执行此操作很可能会减少错误/怪异行为。
如果您不是应用程序的原始作者,那么这种手动查找/替换也是一个机会,让您比一些自动方法更熟悉代码库。
自动:快速,几乎肯定会导致一些可怕的错误
手动:速度较慢(可能),几乎肯定会导致更好的理解,更少的错误——而且任何引入的错误都会因为你更好的理解而更容易修复。