繁体   English   中英

如何在 Laravel whoops 输出中隐藏 .env 密码?

[英]How to hide .env passwords in Laravel whoops output?

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

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

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

Laravel 5.5.13 开始,您可以通过在config/app.php debug_blacklistdebug_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 的解决方案。

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

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

输出:

在此处输入图片说明

编辑:

  1. 传说从 laravel 7x 开始,你需要debug_hide键来代替
  2. 如果您想在 Ignition 中隐藏会话和 cookie(因为较新版本的 Laravel 使用火炬/点火来解决错误),请使用: Laravel / Ignition:如何从请求选项卡中隐藏会话信息?

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

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

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

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

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

干杯!

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

只需使用安装它

composer require glaivepro/hidevara

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

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

通常对于本地开发,我们应该将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/

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

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

只是改变

APP_DEBUG=true 

至:

APP_DEBUG=false

在 .env 文件中。

对于 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);})),
],

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

TIPS #3:调试变量

APP_DEBUG=true 到 APP_DEBUG=false

注意:

生产环境一直保持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"

我在开发机器上也遇到了这个问题。 我的解决方案是编辑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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM