php - 如何在 Ubuntu 和 Windows 中设置环境变量并安全存储?

标签 php ubuntu laravel laravel-4 environment-variables

我正在开发基于 laravel 的应用程序。我需要在配置中设置我的数据库密码,以便 laravel 可以使用它来连接数据库。

现在我有两个问题:
1)我不想为我使用的所有其他本地环境设置密码。
2)我不想在配置文件中设置密码,因为当我在 git 上与团队成员共享代码时,他们可以查看我的密码。

我可能已经想出了解决这个问题的方法,即将密码存储在环境变量中,然后使用 getenv() PHP 函数在配置文件中检索它。所以现在我可以在任意数量的环境中设置环境变量,配置文件中的代码将保持不变,其他成员也看不到我的密码。

现在我不知道如何设置环境变量,以及其他诸如全局/局部环境变量和临时/持久变量之类的东西。

如果我将密码存储在环境变量中,我应该对这些密码进行哈希处理吗?其他登录我的机器的用户可以访问它们吗?
如果我对它们进行哈希处理并存储它们,我应该如何在配置文件中使用它们?

有没有一种不同的、更理想的方法来解决我的问题?

最佳答案

Laravel 方式

Laravel 使用 .env.php为您解决此问题的文件:http://laravel.com/docs/configuration#protecting-sensitive-configuration .但是由于您仍然需要在 start.php 文件中设置环境,所以我更喜欢这样做:

我的路

我创建了一个 .environment我的应用程序根文件夹中的文件,其中包括:

<?php

return [

    'LARAVEL_ENV' => 'development',

    'DOMAIN' => 'myapp.com',

    'DEBUG_MODE' => true,

    'MAIN.DATABASE_HOST' => 'localhost',
    'MAIN.DATABASE_NAME' => 'databasename',
    'MAIN.DATABASE_USER' => 'myusername',
    'MAIN.DATABASE_PASSWORD' => 'basswort',

];

我有一个类来加载环境文件:
<?php

namespace PragmaRX\Support;

use Exception;

class Environment {

    protected static $loaded = false;

    public static function load($file = null)
    {
        if ( ! static::$loaded)
        {
            if ( ! file_exists($file))
            {
                throw new Exception('Environment file (.environment) was not set or does not exists: '.$file);
            }

            foreach(require $file as $key => $value)
            {
                if ($value === false)
                {
                    $value = '(false)';
                }
                else
                if ($value === null)
                {
                    $value = '(null)';
                }
                else
                if (empty($value))
                {
                    $value = '(empty)';
                }

                putenv(sprintf('%s=%s', $key, $value));
            }

            static::$loaded = true;
        }
    }

    public static function getDetectionClosure($file = null)
    {
        static::load($file);

        return function() { return getenv('LARAVEL_ENV'); };
    }
}

然后在我的 app/bootstrap/start.php 中,我只需要以这种方式加载它:
$env = $app->detectEnvironment(
    \App\Environment::getDetectionClosure(__DIR__.'/../.environment')
);

如您所见,闭包将返回当前的 LARAVEL_ENV,存储在我的 .environment 文件中。但它也会将所有 key 加载到 PHP 环境中,所以,现在,在我的应用程序中,我只需要
<?php

return [

    'fetch' => PDO::FETCH_CLASS,

    'default' => 'main',

    'connections' => [

        'main' => [
            'driver'   => 'pgsql',
            'host'     => getenv('MAIN.DATABASE_HOST'),
            'database' => getenv('MAIN.DATABASE_NAME'),
            'username' => getenv('MAIN.DATABASE_USER'),
            'password' => getenv('MAIN.DATABASE_PASSWORD'),
            'charset'  => 'utf8',
            'prefix'   => '',
            'schema'   => 'public',
        ],

    ],

];

添加 .environment将文件添加到您的 gitignore 文件中,您应该是安全的,但是您当然必须在每次设置新服务器时创建(或复制和编辑)该文件。

关于安全

您系统中的所有内容都是一个文件,如果您的文件受到保护,您就会受到保护。就是这么简单。 VirtualHost 文件是您的网络服务器可访问的文件,如果有人入侵您的网络服务器,您不仅会暴露您的 .environment 文件,还会暴露您的 VirtualHost 文件,因此 IMO 使用一个或另一个并不安全。

关于php - 如何在 Ubuntu 和 Windows 中设置环境变量并安全存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529677/

相关文章:

php - 在同一函数、多个过滤器中传递 3 个 where () 条件的正确方法是什么? Eloquent - laravel

php - Laravel Route 无法正确显示页面

php - 如何将 php-pear 安装到 AWS EC2

ubuntu - 使用 ImageMagick 从文本生成图像?

linux - SSH 连接被远程主机关闭

python-2.7 - 在 Google Cloud 中通过 python 运行的 BigQuery 结果与在 MAC 上运行的结果不匹配

php - 使用 codeigniter 和 htaccess 删除 index.php 和 301 重定向

javascript - 更改按钮单击 codeigniter 中的枚举值

php - 选择特定的 MYSQL 行

php - "latin1"DB 的 Laravel 编码问题