使代码在关闭 register_globals 的情况下工作
-
08-06-2019 - |
题
我继承了一些遗留的 PHP 代码,这些代码是在使用标准做法时写回的 register_globals
(从 PHP 4.2.0 开始,该指令默认为关闭,已发布 22。2002 年 4 月)。
我们现在知道启用它对安全性不利。问题是如何找到代码中所有需要使用的地方 $_GET
或者 $_POST
?我唯一的想法是设置错误报告以警告未初始化的变量,然后测试站点的每个部分。有更容易的方法吗?我是否必须测试站点中的每个代码路径,或者 PHP 是否会基于文件发出警告?
解决方案
如果将错误报告设置为 E_ALL,它会在错误日志中警告未定义的变量,并包含文件名和行号(假设您正在记录到文件)。但是,只有当遇到未定义的变量时它才会发出警告,所以我认为您必须测试每个代码路径。从命令行运行 php 似乎也没有帮助。
有一个名为 xdebug 的调试工具,还没有尝试过,但也许它有用?
其他提示
您可以手动“伪造”寄存器全局效果,但增加一些安全性。(我从名为 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];
我知道有一种方法可以使用某个命令为该脚本设置 php.ini 值,因此我去寻找并发现了这个 - 转到页面上的最后一篇文章
我还发现以下可能有用的帖子 - 转到页面上的最后一篇文章
如果没有人找到答案,我会补充这一点,但我现在必须赶火车。
不隶属于 StackOverflow