Laravelのwhoops出力でパスワードやその他の機密環境変数を画面上で非表示にするにはどうすればよいですか?
他の人が私の開発作業を見ていることもあります。例外がスローされた場合、これらの秘密を彼らに見せたくありませんが、デバッグのオンとオフを切り替えたり、簡単なプレビューのために専用サイトを起動したりする必要もありません。
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',
],
],
];
この出力の結果:
手伝ってくれたジェフとラヒールに感謝しますが、ちょっとした落とし穴が見つかりました。
_ENV
からすべての環境キーを消去しても、リストされている_SERVER
変数を通じて同じキーがまだ公開されています。
config/app.php
に以下のコードを追加すると、whoopsページからすべての環境変数が非表示になります。
'debug_blacklist' => [
'_SERVER' => array_keys($_ENV),
'_ENV' => array_keys($_ENV),
],
@jeff + @raheelによる解決策は素晴らしい!!!最近、プロジェクトで1つまたは2つのプロパティをホワイトリストに登録したいことがわかったため、上記に基づいて、デバッグする特定のプロパティを次のようなものでホワイトリストに登録できます。
'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"
乾杯!
この問題を解決するために package を作成しました。
を使用してインストールするだけです
composer require glaivepro/hidevara
ほとんどのサーバーとすべてのenv変数が削除されます。 $_POST
のパスワードのようなフィールドは、値が非表示になります。
ブラックリストまたはホワイトリストのアプローチでカスタマイズして、好きなようにフィールドを表示/難読化/削除することもできます。
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,
],
];
より良い解決策に感謝します。