【问题标题】:How to set an environment variable in Ubuntu and Windows and store it securely?如何在 Ubuntu 和 Windows 中设置环境变量并安全存储?
【发布时间】:2014-10-21 04:29:21
【问题描述】:

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

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

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

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

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

有没有其他更理想的方法来解决我的问题?

【问题讨论】:

  • 为什么不使用第二个本地配置文件,其中包含密码且未纳入源代码控制? (然后您的合作者将不得不创建他们自己的此类文件。)如果您设置环境变量,则必须将其代码存储在某个文件中,对吗?您打算如何解决这个问题?

标签: php ubuntu laravel laravel-4 environment-variables


【解决方案1】:

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 文件中。但它也会将所有密钥加载到 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 使用一个或另一个并不安全。

【讨论】:

  • 非常感谢!这正是我想要的!
  • 是不是也要加密.env.php文件中的密码,然后在config文件中解密?
  • 我认为没有必要,但是是的,这样做会更安全一些。在我看来,对于我们使用的所有东西,完全不同的密码比我们可能想到的任何其他混淆方法都要好。
【解决方案2】:

无论如何,我都不是安全方面的专家,但我认为您应该避免尝试做您想做的事情,而只是定义您的环境。如果你真的想设置一个环境变量,这就是你在 Ubuntu 中的做法:

在你的vhost:

<VirtualHost *:80>
    SetEnv APP_ENV "test"
    ...
</VirtualHost>

我假设 Windows 是您的客户端计算机?

【讨论】:

  • 我同时使用 Ubuntu 和 Windows。我已经在两台机器上克隆了存储库。
【解决方案3】:

已经有很多很好的答案,但作为旁注。您可以在 .gitignore 中包含您的数据库配置文件,这样它就不会被 git 在开发团队之间共享。项目文件中的 config.php.orig 和 .gitignore 中列出的您自己的副本 config.php 之类的东西应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2021-03-23
    • 2017-12-20
    相关资源
    最近更新 更多