使代码与register_globals一起使用关闭

时间:2008-08-09 05:13:56

标签: php register-globals

我继承了一些遗留的PHP代码,当使用register_globals作为标准做法时,这些代码被写回(从PHP 4.2.0起,该指令默认为关闭,2002年4月22日发布)。

我们现在知道,启用它对安全性有害。问题是如何在代码中找到我需要使用$_GET$_POST的所有位置?我唯一的想法是设置错误报告以警告未初始化的变量,然后测试站点的每个部分。有没有更简单的方法?我是否必须测试站点中的每个代码路径,或者PHP会在文件的基础上发出警告吗?

4 个答案:

答案 0 :(得分:5)

如果您将错误报告设置为E_ALL,它会在错误日志中警告未完成的变量以及文件名和行号(假设您正在登录文件)。但是,它只会在遇到未定义的变量时发出警告,因此我认为您必须测试每个代码路径。从命令行运行php似乎也没有帮助。

有一个名为xdebug的调试工具,尚未尝试过,但可能有用吗?

答案 1 :(得分:3)

我使用内置的script函数编写了Tokenizer。它非常粗糙,但它适用于我正在研究的代码库。我相信你也可以使用CodeSniffer

答案 2 :(得分:2)

您可以手动“伪造”注册全局效果但添加一些安全性。 (我部分从名为xoops的osCommerce fork中抓取了这个)

//  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变量的列表,以帮助您最终用$ _REQUEST ['return_url]替换所有出现的,例如$ return_url;

答案 3 :(得分:0)

我知道有一种方法可以使用某个命令为该脚本设置php.ini值,因此我也会查找并找到它 - Goto last post on page

我还发现了以下可能有用的帖子 - Goto last post on the page

如果没有人找到答案我会更加补充,但我现在必须赶上火车。