作为调试应用程序的一部分,我将 $_SERVER 变量记录到我的日志表中。我注意到 .env 文件中的自定义设置包含在 $_SERVER 变量中,包括数据库凭据。这是正常的吗?似乎是一个非常糟糕的主意。
例如,当我获取 $_SERVER 的内容时,包含以下内容(数据为 JSON 格式用于日志记录):
...
"CI_ENVIRONMENT":"production",
"database.default.hostname":"localhost",
"database.default.database":"app",
"database.default.username":"app_user",
"database.default.password":"*REDACTED*",
"database.default.DBDriver":"MySQLi",
...
由于这是一个仅服务器变量,我猜对此没有具体的担忧,但令人震惊的是在日志表中看到数据库凭据,我没想到它们最终会出现。
这正常吗?似乎是一个非常糟糕的主意。
参考普通 PHP 和 Apache/Nginx Web 服务器,您不会在
.env
超全局变量中找到
$_SERVER
文件环境变量。
但是,在 CodeIgniter 4 的世界中,在撰写本文时,所有已配置的
.env
文件环境变量都会被复制到 $_ENV
和 $_SERVER
超全局变量(如果它们不这样做)已经存在了。
// Load environment settings from .env files into $_SERVER and $_ENV
require_once SYSTEMPATH . 'Config/DotEnv.php';
(new CodeIgniter\Config\DotEnv(ROOTPATH))->load();
protected function setVariable(string $name, string $value = '')
{
if (! getenv($name, true)) {
putenv("{$name}={$value}");
}
if (empty($_ENV[$name])) {
$_ENV[$name] = $value;
}
if (empty($_SERVER[$name])) {
$_SERVER[$name] = $value;
}
}
我不确定为什么
.env
文件环境变量被复制到 $_SERVER
超全局变量,但我认为这样做是为了方便。
至于
$_SERVER
超全局变量内容的安全性,请参考哪些$_SERVER变量是安全的?
由于这是一个仅服务器变量,我没有具体的担忧 我猜是这样,但看到数据库凭据令人震惊 在日志表中,我没想到它们会最终出现。
我也很惊讶地注意到这种行为。😮 尽管如此,作为问题的解决方案,不要记录
$_SERVER
超全局变量,而是记录以下结果:
array_diff($_SERVER, $_ENV);
这将为您提供一个关联数组,该数组没有有
.env
文件环境变量。