如何保护存储在Laravel环境文件中的数据库凭据?

时间:2014-08-15 03:08:03

标签: php security laravel

我最近为Laravel切换到基于环境的应用程序部署,我决定使用$ _ENV在.env文件中存储我的本地和生产服务器的凭据但是我发现调试打开时出现异常抛出错误显示公开数据库凭据的环境变量。

现在我确定调试将始终关闭生产,因为这是我默认的,然后我在本地环境的本地文件夹中覆盖它,然而,如果某种程度上某些调试在生产时打开并且用户强制执行404异常,他们需要做的只是读取页面,直到他们在普通视图中看到环境变量暴露凭证。在文档中,它表示对任何“真实”应用程序来说,保持数据库凭据远离实际配置是最佳做法。 我在这里可能有点偏执。

有没有办法可以限制laravel显示的调试屏幕中显示的内容?

2 个答案:

答案 0 :(得分:6)

我刚刚遇到了同样的问题,而我正在处理的项目要求我暂时将我的开发机器打开到邪恶的外部世界来测试一些API回调。

因此,每当触发whoops时,我都会暴露所有宝贵的密钥和密码。即使它是一个盲目的API回调机器,他们有机会记录对他们的请求的响应,一些工程师筛选它们并找到一些AWS密钥,不用了。

这就是我现在使用的:

App::error(function (Exception $exception, $code)
{
    // Never, ever, use environment variables in responses, not even when debugging
    $_SERVER = array_except($_SERVER, array_keys($_ENV));
    $_ENV = [];
});

答案 1 :(得分:4)

Laravel使用Whoops(filp/whoops)创建调试页面,您可以看到here使用$_ENV来获取环境变量。虽然不是很理想,但可以简单地清空$_ENV,以防在本地以外的任何环境中抛出错误。

通过简单地在App::error中重写App::fatal(可能还有app/start/global.php)就可以做到这一点非常简单:

App::error(function(Exception $exception, $code) {
    Log::error($exception);

    if (App::environment() !== 'local') {
        $_ENV = [];
    }
});

这是有效的,因为在Whoops处理程序之前调用了异常处理程序。

现在,正确更好的方法是创建一个扩展Whoops\Handler\PrettyPageHandler的类,它不会显示环境变量或更改任何其他变量不受欢迎的行为,并根据环境将其注册为您应用的whoops.handler组件,类似于Illuminate\Exception\ExceptionServiceProvider:registerPrettyWhoopsHandler上的操作方式。不过,我认为这不值得那么麻烦。