Как скрыть пароли.env в выводе Laravel whoops?

Как я могу скрыть свои пароли и другие конфиденциальные переменные окружения на экране в выводах Laravel's whoops?

Иногда другие люди смотрят на мою разработку. Я не хочу, чтобы они видели эти секреты, если выдается исключение, но я также не хочу постоянно включать и выключать отладку или раскручивать выделенный сайт только для быстрого предварительного просмотра.

скриншот вывода whoops с показанными паролями

12 ответов

Решение

Начиная с Laravel 5.5.13, появилась новая функция, которая позволяет вам занести в черный список определенные переменные в config/app.php под ключ debug_blacklist, Когда генерируется исключение, кавычки маскируют эти значения звездочками * для каждого персонажа.

Например, учитывая это 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 variables в то время как все еще используют возгласы, вот решение:

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

Выход:

Спасибо Джеффу и Рахилу за помощь, но я только что нашел небольшую ошибку:

Даже если я уберу все ключи окружения из _ENVте же ключи все еще выставлены через _SERVER Переменные в списке.

Добавление кода ниже в config/app.php скрыл бы все переменные окружения со страницы whoops:

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

Я сделал пакет, чтобы решить эту проблему.

Просто установите его, используя

composer require glaivepro/hidevara

Большая часть сервера и все переменные env будут удалены. Любые подобные паролю поля в $_POST будут скрыты их значения.

Вы также можете настроить его либо в черном, либо в белом списках, чтобы показывать / обфусцировать / удалять поля по своему усмотрению.

Решение от @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_DEBUG значение true. Чтобы мы могли лучше понять ошибку отладки и предупреждения.

Но в производственной среде это значение всегда должно быть ложным. Если в рабочей среде установлено значение true, вы рискуете раскрыть конфиденциальные пароли env конечным пользователям вашего приложения.

Начиная с Laravel 5.5.x также предоставляет решение для этого.

Вам просто нужно добавить debug_blacklist вариант в вашем config/app.phpФайл конфигурации. После добавления этой опции 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.

Здесь есть много отличных ответов (спасибо @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_URL а также QUERY_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"

Для 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.7https://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

ПРИМЕЧАНИЕ:

Производственная среда всегда держать отладку False

Я тоже немного боролся с этим на машине разработчика. мое решение было отредактировать 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);
Другие вопросы по тегам