我正在开发基于laravel的应用程序。我需要在配置中设置我的数据库密码,以便laravel可以使用它来连接数据库。
现在我有两个问题: 1)我不想为我使用的每个其他本地环境设置密码。 2)我不想在配置文件中设置密码,因为当我在git上与我的团队成员共享代码时,他们可以查看我的密码。
我可能已经找到了解决这个问题的方法,即将密码存储在环境变量中,然后使用getenv()PHP函数在配置文件中检索它。所以现在我可以在任意数量的环境中设置环境变量,配置文件中的代码将保持不变,其他成员也将无法看到我的密码。
现在我不知道如何设置环境变量,以及其他东西,如全局/局部环境变量和临时/持久变量。
如果我将密码存储在环境变量中,我应该散列这些密码吗?登录我的机器的其他用户是否可以访问它们? 如果我对它们进行散列并存储它们,我应该如何在配置文件中使用它们?
我的问题有不同的,更理想的方法吗?
答案 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之类的东西应该可以解决问题。