老 PHP 程序的 Register Globals 问题

今天,学校一个部门网站要转移到虚拟主机上来,学校虚拟主机上已经挂了 n 多个站点,跑 ASP、PHP、JSP、ASP.NET 的站点都有。因此为了保证安全性,许多不安全的选项都没有开启。所以该网站放上来以后发现许多功能不能用了。这个网站是 PHP 的,原来跑在一台单独的 Apache 服务器上。这个网站编码属于早期的很烂的编码风格,提交的变量都不是通过 $_GET、$_POST 等变量获取,而是直接使用变量名。也就是说这种编码的网页需要在 php.ini 中打开 Register Globals 选项才能正确执行。如果它是一台单独的服务器,打开那个选项也无所谓,大不了就那一个站点被入侵。可是放在虚拟主机上就不同了。要是开了那个选项,其他的 站点也就会受到威胁了。可是要全面修改这个程序也不太可能,一是这个网站不是我开发的,我只是帮他们发布,我没有义务给他们改程序,二是程序太多,我也不 可能一个个的给他们改。于是找了个简单的办法,那个网站虽然比较烂,但有一点不错,每个程序开头都包含了一个 global.php 文件。于是在这个程序中加了一段代码。实现了跟开启 Register Globals 同样的功能。代码如下:

  1. <?php
  2. function register_globals($item, $key) {
  3.     global $$key;
  4.     $$key = $item;
  5. }
  6.  
  7. array_walk($_GET , 'register_globals');
  8. array_walk($_POST , 'register_globals');
  9. array_walk($_COOKIE , 'register_globals');
  10. array_walk($_SERVER , 'register_globals');
  11.  
  12. ...
  13. session_start();
  14. array_walk($_SESSION , 'register_globals');
  15. ...
  16. ?>

其中 array_walk($_SESSION , ‘register_globals’); 要放在 session_start(); 之后才管用。

这样子,就算被入侵了,也就这一个站点倒霉,其他站点不会跟着受牵连。

标签: PHP

« 上一篇 | 下一篇 »

只显示10条记录相关文章

1 条回复至 "老 PHP 程序的 Register Globals 问题" 的评论

我觉得直接用extract($_GET)函数似乎更要简单一些

HDR 于 2010-12-24 17:21:31 提交#1


发表评论

评论 (必须):