使代码与register_globals一起工作已关闭
我继承了一些遗留的PHP代码,这是使用register_globals
的标准做法写的(从PHP 4.2.0开始,此指令默认为off,发布于2002年4月22日)。
现在我们知道启用它对安全性是有害的。问题是如何在代码中找到需要使用$ _GET或者$ _POST的所有位置?我唯一的想法是设置错误报告以警告未初始化的变量,然后测试站点的每个部分。有没有更简单的方法?我将不得不测试站点中的每个代码路径,还是PHP会基于文件发出警告?
解决方案
回答
我知道有一种方法可以使用特定命令为该脚本设置php.ini值,因此我去寻找了,也发现了这一点。Goto页面上的最后一篇文章
我还发现了以下可能有用的帖子Goto页面上的最后一篇文章
如果没有人找到答案,我将在此添加更多内容,但我现在必须坐火车。
回答
如果将错误报告设置为E_ALL,则会在错误日志中警告有关未定义变量的完整信息,该变量包含文件名和行号(假设我们正在登录到文件)。但是,只有在遇到未定义的变量时,它才会发出警告,因此,我认为我们必须测试每个代码路径。从命令行运行php似乎也无济于事。
有一个名为xdebug的调试工具,还没有尝试过,但是也许有用吗?
回答
我使用内置的Tokenizer函数编写了脚本。它相当粗糙,但是它适用于我正在开发的代码库。我相信我们也可以使用CodeSniffer。
回答
我们可以手动"伪造"寄存器全局效果,但可以增加一些安全性。 (我从名为xoops的osCommerce分支中部分抓取了此信息)
// Detect bad global variables $bad_global_list = array('GLOBALS', '_SESSION', 'HTTP_SESSION_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_REQUEST', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_FILES', 'HTTP_POST_FILES'); foreach ($bad_global_list as $bad_global ) { if ( isset( $_REQUEST[$bad_global] ) ) { die('Bad Global'); } } // Make global variables foreach ($_REQUEST as $name -> $value) { $$name = $value; // Creates a varable nammed $name equal to $value. }
尽管我们想对其进行调整,以使代码更安全,但至少要通过将全局配置变量(例如路径和基本url)添加到错误的全局列表中来进行。
我们还可以使用它轻松地编译所有使用的get / post变量的列表,以最终将所有出现的$ return_url替换为$ _REQUEST ['return_url];。