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


How to secure database credentials stored in Laravel environment files?

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

现在我确信调试将始终关闭生产,因为这是我默认的,然后我覆盖它在本地文件夹为我的本地环境然而,什么如果以某种方式调试在生产中打开,用户强制404异常,所有他们需要做的就是读取页面,直到他们看到环境变量在普通视图暴露凭据。在文档中,它说对于任何"真正的"应用程序来说,将数据库凭据与实际配置保持距离是最佳实践。我可能有点偏执。

是否有一种方法可以限制在laravel显示的调试屏幕中显示的内容?

我最近遇到了同样的问题,我正在做的一个项目要求我暂时打开我的开发机器,以测试一些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 = [];
});

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

这是非常简单的,只需重写app/start/global.php中的App::error(也可能是App::fatal),像这样:

App::error(function(Exception $exception, $code) {
    Log::error($exception);
    if (App::environment() !== 'local') {
        $_ENV = [];
    }
});

这可以工作,因为异常处理程序在Whoops处理程序之前被调用。

现在,更好的方法是创建一个扩展Whoops'Handler'PrettyPageHandler的类,它不会显示环境变量或改变任何其他不想要的行为,并且根据环境,将其注册为whoops.handler组件为您的应用程序,类似于如何在Illuminate'Exception'ExceptionServiceProvider:registerPrettyWhoopsHandler上完成。不过我觉得不值得这么麻烦。