$_SERVER 中的 Codeigniter 4 .env 变量?

问题描述 投票:0回答:1

作为调试应用程序的一部分,我将 $_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 security codeigniter-4 .env
1个回答
2
投票

说明:

这正常吗?似乎是一个非常糟糕的主意。

参考普通 PHP 和 Apache/Nginx Web 服务器,您不会

.env超全局变量
中找到
$_SERVER
文件环境变量。

但是,在 CodeIgniter 4 的世界中,在撰写本文时,所有已配置的

.env
文件环境变量都会被复制
$_ENV
$_SERVER
超全局变量(如果它们不这样做)已经存在了。

摘自CodeIgniter4/public/index.php

// Load environment settings from .env files into $_SERVER and $_ENV
require_once SYSTEMPATH . 'Config/DotEnv.php';
(new CodeIgniter\Config\DotEnv(ROOTPATH))->load();

摘自CodeIgniter4/system/Config/DotEnv.php

    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
文件环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.