72

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

有时其他人正在查看我的开发工作。如果抛出异常,我不希望他们看到这些秘密,但我也不希望不得不不断地打开和关闭调试,或者为了快速预览而启动一个专用站点。

whoops 输出屏幕截图,显示密码

4

12 回答 12

107

Laravel 5.5.13 开始,您可以通过在debug_blacklistin键下列出变量来审查变量config/app.php。当抛出异常时, 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',
        ],
    ],
];

输出结果:

哎呀异常页面

于 2017-09-25T13:57:51.503 回答
76

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

第二,如果你像我一样想一直隐藏,env variables但仍然使用 whoops,这是一个解决方案:

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

输出:

在此处输入图像描述

编辑: 传说从 laravel 7x 开始你需要debug_hidekey 代替

于 2017-12-06T00:46:00.870 回答
12

感谢 Jeff 和 Raheel 的帮助,但我发现了一个小问题:

即使我从 中清除所有环境键_ENV,相同的键仍然会通过_SERVER列出的变量公开。

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

'debug_blacklist' => [
        '_SERVER' => array_keys($_ENV),
        '_ENV' => array_keys($_ENV),        
],
于 2018-08-09T06:27:07.177 回答
8

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

只需使用它安装它

composer require glaivepro/hidevara

大多数服务器和所有环境变量都将被删除。中的任何类似密码的字段都$_POST将隐藏其值。

您还可以使用黑名单或白名单方法对其进行自定义,以根据需要显示/混淆/删除字段。

于 2018-11-06T21:57:41.510 回答
8

@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"

干杯!

于 2019-03-08T00:58:37.607 回答
5

Usually for local development, we should set the APP_DEBUG environment variable to true. So that we can have better insights of the debugging error and warnings.

But in the production environment, this value should always be false. If the value is set to true in production, you risk exposing sensitive env passwords to your application’s end users.

As of Laravel 5.5.x also provides a solution for it.

You just need to add the debug_blacklist option in your config/app.php configuration file. After adding this option, Laravel will blacklist all the keys mentioned in debug_blacklist option with asterisk.

You can use it with two ways:

Method 1 – Blacklist selective ENV keys and passwords

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

Method 2 – Blacklist all the ENV keys and passwords

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

Reference Taken From : https://techjeni.com/how-to-secure-and-hide-env-passwords-from-laravel-debug-output/

于 2020-06-10T05:38:05.010 回答
3

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,
    ],
];

如果有更好的解决方案,我将不胜感激。

于 2018-08-09T22:21:30.253 回答
2

只是改变

APP_DEBUG=true 

至:

APP_DEBUG=false

在 .env 文件中。

于 2020-02-13T04:37:55.153 回答
0

我在生产环境中也面临这个问题,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

笔记:

生产环境始终保持Debug False

于 2021-03-29T03:40:13.987 回答
0

这里有很多很棒的答案(感谢@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中的密码,但显示APP_URLQUERY_STRING来自$_SERVER

DEBUG_VAR_LISTING="SERVER,ENV,POST,COOKIE"
DEBUG_VAR_WHITELIST_SERVER="APP_URL,QUERY_STRING"
DEBUG_VAR_WHITELIST_ENV=""
DEBUG_VAR_BLACKLIST_POST="password"
于 2021-04-06T09:49:49.193 回答
0

对于 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);})),
],
于 2019-12-06T19:44:01.617 回答
-1

我在开发机器上也为此苦苦挣扎。我的解决方案是编辑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);
于 2020-10-15T20:50:53.650 回答