【问题标题】:How to hide .env passwords in Laravel whoops output?如何在 Laravel whoops 输出中隐藏 .env 密码?
【发布时间】:2018-03-06 12:42:34
【问题描述】:

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

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

【问题讨论】:

    标签: php laravel environment-variables secret-key whoops


    【解决方案1】:

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

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

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

    输出:

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

    【讨论】:

    • 谢谢。我仍然很困惑为什么人们会希望所有的环境变量在每个错误时都打印在屏幕上。
    • 完全是人.. 可能会说 10% 会想要它.. 但不是 90% 的 laravel 开发人员!
    • 听听!几个月前我不小心暴露了我的 mailgun api 密钥,导致超过 1200 封网络钓鱼电子邮件通过我的帐户发送。太可怕了!如果我需要查看我的环境中的内容,我会以老式的方式打开该死的东西!
    • 没错!!如果我需要知道我的环境,我只会打开环境文件,而不是让环境意外暴露在一个我不知道一周左右的页面上
    • 谢谢。很好的答案。
    【解决方案2】:

    这里有很多很棒的答案(感谢@Jeff 和@Raheel 和@Benjamin 以及其他所有人),但我希望有一个更灵活和通用的解决方案。我进一步扩展了这个用于 config/app.php 文件的 sn-p:

    $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_URL 和 @来自 $_SERVER 的 987654323@:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我在开发机器上也为此苦苦挣扎。我的解决方案是编辑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);
        

        【讨论】:

        • 感谢分享!但是我真的不想修改供应商文件,因为它在升级时会增加复杂性。您可以通过对源库进行 PR 来解决此问题。部分匹配似乎也太松散了,就像在您的示例中我们会丢失 emaildonkey 这样的属性,这可能是意外或不需要的,但也许没关系。
        【解决方案5】:

        截至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',
                ],
            ],
        ];
        

        这个输出的结果:

        【讨论】:

        • 对 laravel 文档提出拉取请求可能会很有用
        • @JeffPuckett 啊,你是对的,我错误地认为 0.13 低于 0.4,就像小数位一样
        • 有什么理由不能在 Laravel 5.7 中工作吗?我在 Laravels Foundations 下的 WhoosHander 中找到了 registerBlacklist,但据我所知,它没有被使用。
        【解决方案6】:

        通常对于本地开发,我们应该将APP_DEBUG环境变量设置为true。以便我们更好地了解调试错误和警告。

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

        从 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/

        【讨论】:

          【解决方案7】:

          只是改变

          APP_DEBUG=true 
          

          收件人:

          APP_DEBUG=false
          

          在 .env 文件中。

          【讨论】:

          • 是的,在生产中很棒,但问题表明我正在开发中,所以我希望在这个环境中由 whoops 提供的所有其他细节
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            干杯!

            【讨论】:

            • 我想提一下这个可以加在app.php
            【解决方案10】:

            我已经发了package 来解决这个问题。

            只需使用安装它

            composer require glaivepro/hidevara
            

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

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

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

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

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

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

                【讨论】:

                • 除了代码中的 cookie 行之外,这与 Raheel 的答案有何不同?还是他在你的答案之后编辑了他的答案?
                • '_SERVER' => array_keys($_SERVER) 和 '_SERVER' => array_keys($_ENV) 之间存在细微但显着的区别。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-06-29
                • 1970-01-01
                • 1970-01-01
                • 2012-04-25
                • 2019-12-13
                • 2012-06-14
                • 2020-02-10
                相关资源
                最近更新 更多