1

我有一个相当大的 php 站点,它是为 php4 编写的,并且启用了 register_globals。这是旧的自定义 CMS。现在我想在没有 register_globals 的 php5 主机上运行它。是否可以使用一些脚本自动更改从 $id 解析为 $_GET["id"] 的参数?

wget -r我可以从这个网站上获取参数名称。

它有几十个 php 脚本,手动进行此更改并不容易。

PS:更新:我只想转换 GET 变量。附加行是$var_name = $_GET["var_name"]针对每个参数的。该行应该在脚本中插入非常高的位置,例如通过<? ?>在最顶部添加一个新部分。

4

3 回答 3

4

运行这样的工具会引入在代码中引入错误的巨大风险。

我建议在 superglobals 上运行 extract(),这样你就可以强制 register_globals 并且应用程序可以正常工作。

http://php.net/manual/pl/function.extract.php

接下来,当一切正常时,为输入参数编写一个 OO 包装器,将其打包到漂亮的 DI 容器中,然后开始手动将整个脚本转换为新样式。

于 2011-06-07T04:09:08.040 回答
1

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

  1. 通过执行与 register_globals 相同的操作来模拟寄存器全局变量:在脚本的开头,将来自 GET 和 POST 的所有变量放入全局变量命名空间(即 via extract)。虽然这是最快和最简单的解决方案,但它会导致 register_globals 众所周知的安全问题,并且对应用程序的性能没有帮助
  2. 确定使用的变量并仅通过初始化脚本将它们加载到 $GLOBALS 中。还是不好看
  3. 确定使用的变量并将 GLOBALS 用法替换为 REQUEST
  4. 手动遍历它。这样,您可以确保一切都是正确的,并且之后的麻烦最少。

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

于 2011-06-07T04:12:48.263 回答
0

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

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

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

手动:较慢(可能),几乎肯定会导致更好的理解,更少的错误 - 并且由于您更好的理解,引入的任何错误都将更容易修复。

于 2011-06-07T04:08:52.387 回答