将大型php项目从register_globals转换为_GET[“param”]


Convert big php project from register_globals to _GET["param"]

我有一个相当大的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容器中,并开始手动将整个脚本转换为新样式。

我不知道有什么工具可以帮助您进行转换,但您有几个选择:

  1. 通过执行register_globals所做的相同操作来模拟register_global:在脚本开始时,将GET和POST中的所有变量放入全局变量命名空间(即通过extract)。虽然这是最快、最简单的解决方案,但它会导致register_globals众所周知的安全问题,而且对应用程序的性能没有帮助
  2. 确定所使用的变量,并仅通过init脚本将其加载到$GLOBALS中。还是不太好
  3. 确定使用的变量,并用REQUEST替换GLOBALS用法
  4. 手动浏览。这样,你就可以确保一切都是正确的,并且之后麻烦最小

根据您的描述,解决方案1或2可能是最适合您的,因为cms似乎无论如何都没有更新(这很遗憾)。

尽管实际的查找/替换可能需要更多的时间,但手动执行此操作很可能会减少错误/怪异行为。

如果您不是应用程序的原始作者,那么这种手动查找/替换也是一个机会,让您比一些自动方法更熟悉代码库。

自动:快速,几乎肯定会导致一些可怕的错误

手动:速度较慢(可能),几乎肯定会导致更好的理解,更少的错误——而且任何引入的错误都会因为你更好的理解而更容易修复。