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

时间:2011-06-07 04:04:08

标签: php php4 register-globals

我有一个相当大的php网站,它是为php4和register_globals启用的。这是旧的自定义CMS。现在我想在没有register_globals的php5主机上运行它。是否可以使用某些脚本自动将参数从$ id解析为$ _GET [“id”]?

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

它有几十个PHP脚本,手动更改并不是很容易。

PS:UPDATE:我想只转换GET变量。每个参数的附加行为$var_name = $_GET["var_name"]。该行应该在脚本中插入很高,例如在最顶部添加一个新的<? ?>部分。

3 个答案:

答案 0 :(得分:4)

运行此类工具会增加在代码中引入错误的风险。

我建议在superglobals上运行extract(),这样就可以强制register_globals和aplication正常工作。

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

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

答案 1 :(得分:1)

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

  1. 通过执行与register_globals相同的操作来模拟寄存器全局:在脚本的开头,将所有变量从GET和POST放入全局变量命名空间(即通过extract)。虽然这是最快速且最简单的解决方案,但它会导致register_globals众所周知的安全问题,并且它对应用程序的性能没有帮助
  2. 确定使用的变量,并仅通过init脚本将它们加载到$ GLOBALS中。仍然不好
  3. 确定使用的变量并用REQUEST
  4. 替换GLOBALS用法
  5. 手动浏览。通过这种方式,您可以确保一切正确并且之后的麻烦最少。
  6. 根据您的描述,解决方案1或2可能是最适合您的,因为cms似乎无论如何都不会更新(这是一种耻辱)。

答案 2 :(得分:0)

虽然实际发现/替换可能需要更多时间,但手动执行此操作很可能会导致更少的错误/奇怪的行为。

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

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

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