如何隐藏. env 密码在 Laravel 哎呀输出?

如何在 Laravel 的“哎呀”输出中隐藏我的密码和其他敏感的环境变量?

有时候别人在看我的开发工作。如果抛出异常,我不希望他们看到这些秘密,但是我也不希望为了快速预览而不停地切换调试或者旋转一个专门的站点。

whoops output screenshot with passwords shown

33853 次浏览

Laravel 5.5.13开始,您可以通过在 config/app.php中的键 debug_blacklist下列出变量来审查它们。当抛出异常时,whoops 将用星号 *掩盖这些值。

例如,给定这个 config/app.php

return [


// ...


'debug_blacklist' => [
'_ENV' => [
'APP_KEY',
'DB_PASSWORD',
'REDIS_PASSWORD',
'MAIL_PASSWORD',
'PUSHER_APP_KEY',
'PUSHER_APP_SECRET',
],
'_SERVER' => [
'APP_KEY',
'DB_PASSWORD',
'REDIS_PASSWORD',
'MAIL_PASSWORD',
'PUSHER_APP_KEY',
'PUSHER_APP_SECRET',
],
'_POST' => [
'password',
],
],
];

产出结果如下:

whoops exception page

首先,喜欢上面 Jeff 的解决方案。

第二,如果你像我一样想隐藏所有的 env variables,同时仍然使用哎呀,这里有一个解决方案:

'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],

产出:

enter image description here

编辑: 传说,因为幼虫7倍,你将需要 debug_hide关键而不是

谢谢杰夫和拉希尔的帮助,但我发现了一个小问题:

即使我从 _ENV中清除了所有的环境键,相同的键仍然通过列出的 _SERVER变量暴露出来。

config/app.php中添加以下代码将隐藏所有的环境变量:

'debug_blacklist' => [
'_SERVER' => array_keys($_ENV),
'_ENV' => array_keys($_ENV),
],

Laravel 5.6不适合我的。 但这个方法有效:

$envKeys = [];
$serverKeys = [];
$cookieKeys = [];
foreach ( $_ENV as $key => $value ) { if(is_string($value)) $envKeys[] = $key; }
foreach ( $_SERVER as $key => $value ) { if(is_string($value)) $serverKeys[] = $key; }
foreach ( $_COOKIE as $key => $value ) { if(is_string($value)) $cookieKeys[] = $key; }


return [


// ...


'debug_blacklist' => [
'_COOKIE'   => $cookieKeys,
'_SERVER'   => $serverKeys,
'_ENV'      => $envKeys,
],
];

我希望能有更好的解决办法。

我做了一个 包裹来解决这个问题。

只要安装它使用

composer require glaivepro/hidevara

大部分服务器和所有 env 变量将被删除。$_POST中任何类似密码的字段都将隐藏它们的值。

您还可以使用黑名单或白名单方法对其进行自定义,以便按照您的喜好显示/混淆/删除字段。

@ jeff +@raheel 的解决方案太棒了! ! !在最近的一个项目中,我们发现我们有时候想要列出一两个属性,所以在上面的基础上,你可以列出你想要调试的特定属性,比如:

'debug_blacklist' => [
'_COOKIE' => array_diff(array_keys($_COOKIE), array()),
'_SERVER' => array_diff(array_keys($_SERVER), array('APP_URL', 'QUERY_STRING')),
'_ENV' => array_diff(array_keys($_ENV), array()),
],

如果希望通过. env 配置该列表,可以这样做:

'debug_blacklist' => [
'_COOKIE' => array_diff(
array_keys($_COOKIE),
explode(",", env('DEBUG_COOKIE_WHITELIST', ""))
),
'_SERVER' => array_diff(
array_keys($_SERVER),
explode(",", env('DEBUG_SERVER_WHITELIST', ""))
),
'_ENV' => array_diff(
array_keys($_ENV),
explode(",", env('DEBUG_ENV_WHITELIST', ""))
),
],

然后在你的. env 中,做一些像:

DEBUG_SERVER_WHITELIST="APP_URL,QUERY_STRING"

干杯!

对于 Laravel 5.6-5.8:

'debug_blacklist' => [
'_COOKIE'   => array_keys(array_filter($_COOKIE, function($value) {return is_string($value);})),
'_SERVER'   => array_keys(array_filter($_SERVER, function($value) {return is_string($value);})),
'_ENV'      => array_keys(array_filter($_ENV, function($value) {return is_string($value);})),
],

只要改变

APP_DEBUG=true

致:

APP_DEBUG=false

在. env 文件中。

通常情况下,为了本地发展,我们应该将 APP _ DEBUG环境变量设置为 没错。这样我们就可以更好地了解调试错误和警告。

但是在生产环境中,这个值应该始终是 假的。如果在生产环境中将该值设置为 没错,则可能会将敏感的 env 密码暴露给应用程序的最终用户。

到 Laravel 5.5.x 为止,它还提供了一个 解决方案

您只需要在 config/app.php配置文件中添加 debug_blacklist选项。添加此选项后,Laravel 将 黑名单中提到的所有键在 debug_blacklist选项星号。

你可以通过两种方式使用它:

方法1-黑名单选择 ENV 密钥和密码

return [
// ...
'debug_blacklist' => [
'_ENV' => [
'APP_KEY',
'DB_PASSWORD',
],
'_SERVER' => [
'APP_KEY',
'DB_PASSWORD',
],
'_POST' => [
'password',
],
],
];

方法2-黑名单的所有 ENV 密钥和密码

return [
// ...
'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],
]

参考文献: https://techjeni.com/how-to-secure-and-hide-env-passwords-from-laravel-debug-output/

在开发机器上,我也曾为此挣扎过一段时间。我的解决方案是编辑 vendor/filp/whoops/src/Whoops/Handler/PrettyPageHandler.php并添加:

public function sanitizePrivate($data, $badwords){
foreach ($data as $key=>$value) {
       

foreach ($badwords as $keyword) {
// dd($key);
if (strpos(strtolower($key), $keyword) !== FALSE) {
$data[$key] = "***************";
}
}
}
return $data;
}

这会将所有传入的数据转换为小写,然后搜索部分匹配,这样就不必指定密码变量名的所有变体。然后在 handle()函数中定义要排除的术语。

$badwords = array("password", "pwd", "secret", "key", "token", "salt", "mail");
$_SERVER=$this->sanitizePrivate($_SERVER, $badwords);
$_ENV=$this->sanitizePrivate($_ENV, $badwords);

我在生产环境 Laravel 5.7中也面临这个问题 Https://laravel.com/docs/5.7/configuration

这里有三种方法可以重新解决这个问题。

Config/app.php file add following line of code

提示 # 1: 所有变量的阻止列表

'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],

TIPS # 2: 特定变量的阻止列表(最佳实践)

return [


// ...
'_ENV' => [
'APP_KEY',
'DB_PASSWORD',
'REDIS_PASSWORD',
'MAIL_PASSWORD',
'PUSHER_APP_KEY',
'PUSHER_APP_SECRET',
'AWS_APP_SECRET',
'S3_BUCKET_SECRET',
'SOCKET_APP_SECRET',
'TWILIO_APP_SECRET',
],
'_SERVER' => [
'APP_KEY',
'DB_PASSWORD',
],
'_POST' => [
'password',
],
]

提示 # 3: Debug 变量

APP _ DEBUG = true to APP _ DEBUG = false

注意:

生产环境始终保持错误调试

这里有很多很棒的答案(归功于@Jeff 和@Raheel 和@Benjamin 以及其他所有人) ,但是我希望有一个更加灵活和通用的解决方案。我进一步扩展了这个用于 Config/app.php文件的代码片段:

$debug_blacklist=array();
if(env("DEBUG_VAR_LISTING")!==null)
foreach(explode(",", env("DEBUG_VAR_LISTING", "")) as $i){
global ${"_{$i}"};
if(env("DEBUG_VAR_BLACKLIST_{$i}")!==null)
$debug_blacklist["_{$i}"]=explode(",", env("DEBUG_VAR_BLACKLIST_{$i}", ""));
elseif(env("DEBUG_VAR_WHITELIST_{$i}")!==null)
$debug_blacklist["_{$i}"]=array_diff(
array_keys(${"_{$i}"}),
explode(",", env("DEBUG_VAR_WHITELIST_{$i}", ""))
);
}


return [
'debug_blacklist' => $debug_blacklist,
];

然后,你可以直接在 。 env黑名单和白名单,只有当和你需要什么。

所以如果你真的不需要 $_ ENV中的任何东西,你可以阻止所有的变量,例如在 $_ POST中只显示密码,但是在 $_ SERVER中显示 APP_URLQUERY_STRING:

DEBUG_VAR_LISTING="SERVER,ENV,POST,COOKIE"
DEBUG_VAR_WHITELIST_SERVER="APP_URL,QUERY_STRING"
DEBUG_VAR_WHITELIST_ENV=""
DEBUG_VAR_BLACKLIST_POST="password"