13

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

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

4

4 回答 4

6

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

有一个调试工具叫xdebug,没试过,但也许有用?

于 2008-08-09T08:11:55.487 回答
3

我使用内置的Tokenizer函数编写了一个脚本。它非常粗糙,但它适用于我正在处理的代码库。我相信您也可以使用CodeSniffer

于 2008-08-11T01:08:56.370 回答
2

您可以手动“伪造”寄存器全局效果,但会增加一些安全性。(我部分地从名为 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 变量的列表,以帮助您最终用 $_REQUEST['return_url]; 替换所有出现的,比如 $return_url;

于 2008-08-17T17:36:54.673 回答
0

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

我还发现了以下可能有用的帖子-转到页面上的最后一篇文章

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

于 2008-08-09T07:01:06.503 回答