我正在开发基于 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/