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

时间:2014-08-27 14:20:00

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

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

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

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

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

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

我的问题有不同的,更理想的方法吗?

3 个答案:

答案 0 :(得分:1)

Laravel Way

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

我的方式

我在app根文件夹中创建了一个.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')
);

如您所见,闭包将返回存储在我的.environment文件中的当前LARAVEL_ENV。但它也会将所有密钥加载到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您不会使用其中一个或更不安全。

答案 1 :(得分:0)

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

vhost

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

我认为Windows是您的客户机吗?

答案 2 :(得分:0)

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