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

dav*_*d33 6 php security laravel

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

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

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

Jor*_*zem 7

我刚刚遇到了同样的问题,而我正在研究的项目要求我暂时打开我的开发机器到邪恶的外部世界来测试一些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 = [];
});
Run Code Online (Sandbox Code Playgroud)


rmo*_*bis 4

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

App::error只需将其重写(也可能App::fatal)如下所示,即可非常简单地做到app/start/global.php这一点:

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

    if (App::environment() !== 'local') {
        $_ENV = [];
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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