如何在 Laravel 输出中隐藏 .env 密码?
How to hide .env passwords in Laravel whoops output?
如何在 Laravel 的输出中隐藏我的密码和其他敏感环境变量?
有时候其他人在看我的开发工作。我不希望他们在抛出异常时看到这些秘密,但我也不希望不得不不断地打开和关闭调试,或者为了快速预览而启动专用站点。
从 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',
],
],
];
此输出结果:
首先,喜欢上面 Jeff 的解决方案。
2,如果你像我一样想隐藏所有 env variables
同时仍然使用 whoops,这里有一个解决方案:
'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],
输出:
编辑:
传说因为 laravel 7x 你需要 debug_hide
键而不是
感谢 Jeff 和 Raheel 的帮助,但我发现了一个小问题:
即使我清除了 _ENV
中的所有环境键,相同的键仍然通过列出的 _SERVER
变量公开。
在 config/app.php
中添加下面的代码将从 whoops 页面隐藏所有环境变量:
'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,
],
];
如果有更好的解决方案,我将不胜感激。
我做了一个package来解决这个问题。
只需使用
安装即可
composer require glaivepro/hidevara
大部分服务器和所有环境变量都将被删除。 $_POST
中任何类似密码的字段都将隐藏其值。
您还可以根据需要以黑名单或白名单方式自定义 show/obfuscate/remove 字段。
@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环境变量设置为true。以便我们更好地了解调试错误和警告。
但在生产环境中,这个值应该总是false。如果在生产环境中将该值设置为 true,您可能会将敏感的 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
这里有 3 种方法可以解决这个问题。
config/app.php 文件添加下面的代码行
提示#1:所有变量的阻止列表
'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],
提示 #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: 调试变量
APP_DEBUG=true 到 APP_DEBUG=false
注意:
Production enviroment keep always 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_URL
和 QUERY_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"
如何在 Laravel 的输出中隐藏我的密码和其他敏感环境变量?
有时候其他人在看我的开发工作。我不希望他们在抛出异常时看到这些秘密,但我也不希望不得不不断地打开和关闭调试,或者为了快速预览而启动专用站点。
从 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',
],
],
];
此输出结果:
首先,喜欢上面 Jeff 的解决方案。
2,如果你像我一样想隐藏所有 env variables
同时仍然使用 whoops,这里有一个解决方案:
'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],
输出:
编辑:
传说因为 laravel 7x 你需要 debug_hide
键而不是
感谢 Jeff 和 Raheel 的帮助,但我发现了一个小问题:
即使我清除了 _ENV
中的所有环境键,相同的键仍然通过列出的 _SERVER
变量公开。
在 config/app.php
中添加下面的代码将从 whoops 页面隐藏所有环境变量:
'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,
],
];
如果有更好的解决方案,我将不胜感激。
我做了一个package来解决这个问题。
只需使用
安装即可composer require glaivepro/hidevara
大部分服务器和所有环境变量都将被删除。 $_POST
中任何类似密码的字段都将隐藏其值。
您还可以根据需要以黑名单或白名单方式自定义 show/obfuscate/remove 字段。
@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环境变量设置为true。以便我们更好地了解调试错误和警告。
但在生产环境中,这个值应该总是false。如果在生产环境中将该值设置为 true,您可能会将敏感的 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
这里有 3 种方法可以解决这个问题。
config/app.php 文件添加下面的代码行
提示#1:所有变量的阻止列表
'debug_blacklist' => [
'_COOKIE' => array_keys($_COOKIE),
'_SERVER' => array_keys($_SERVER),
'_ENV' => array_keys($_ENV),
],
提示 #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: 调试变量
APP_DEBUG=true 到 APP_DEBUG=false
注意:
Production enviroment keep always 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_URL
和 QUERY_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"