¿Cómo ocultar contraseñas .env en la salida de gritos de Laravel?

6 minutos de lectura

¿Cómo puedo ocultar mis contraseñas y otras variables de entorno sensibles en la pantalla en la salida de gritos de Laravel?

A veces, otras personas miran mi trabajo de desarrollo. No quiero que vean estos secretos si se lanza una excepción, pero tampoco quiero tener que seguir activando y desactivando la depuración, o activar un sitio dedicado solo para obtener una vista previa rápida.

captura de pantalla de salida de gritos con contraseñas mostradas

avatar de usuario
jeff puckett

A partir de Laravel 5.5.13puede censurar variables enumerándolas bajo la clave debug_blacklist en config/app.php. Cuando se lanza una excepción, los gritos enmascararán estos valores con asteriscos. * para cada personaje.

Por ejemplo, dado este 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',
        ],
    ],
];

Resultados en esta salida:

¡Vaya página de excepción!

  • podría ser útil hacer una solicitud de extracción para los documentos de laravel

    – Christophvh

    25 de septiembre de 2017 a las 14:54

  • @JeffPuckett Ah, tienes razón, pensé erróneamente que .13 es más bajo que .4 como lo harías con decimales

    – ii7scw

    5 oct 2017 a las 20:33

  • ¿Hay alguna razón por la que esto no funcione en Laravel 5.7? encontré registerBlacklist dentro de WhoosHander bajo Laravels Foundations pero, por lo que puedo decir, no se usa.

    – Adam Patterson

    17 junio 2019 a las 20:15

avatar de usuario
raheel hasan

En primer lugar, me encanta la solución de Jeff anterior.

Segundo, si como yo quieres ocultar todo el env variables mientras todavía usa gritos, aquí hay una solución:

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

Producción:

ingrese la descripción de la imagen aquí

EDITAR:
Cuenta la leyenda que desde laravel 7x necesitarías debug_hide clave en su lugar

  • Gracias por esto. Todavía estoy confundido por qué la gente querría que todas las variables env se imprimieran en la pantalla con cada error.

    – whisky tibio

    14 de diciembre de 2017 a las 5:24

  • exactamente hombre… se puede decir que el 10% lo querría… ¡pero NO el 90% de los desarrolladores de laravel!

    – Raheel Hasan

    14 de diciembre de 2017 a las 5:36


  • ¡Escucha Escucha! Accidentalmente expuse mi clave API de Mailgun hace unos meses, lo que resultó en más de 1200 correos electrónicos de phishing que llegaron a mi cuenta. ¡Horrendo! Si alguna vez necesito ver lo que hay en mi entorno, ¡lo hago a la vieja escuela abriendo la maldita cosa!

    – whisky tibio

    14 de diciembre de 2017 a las 5:44

  • ¡¡exactamente!! Si necesito saber mi env, simplemente abriría el archivo env y NO tendría el env expuesto por accidente en una página. No tengo idea por una semana más o menos.

    – Raheel Hasan

    14 de diciembre de 2017 a las 6:16

  • Gracias. Gran respuesta.

    – usuario2094178

    19 de diciembre de 2017 a las 1:41

Gracias Jeff y Raheel por ayudarme, pero acabo de encontrar un pequeño problema:

Incluso si borro todas las claves de entorno de _ENVlas mismas teclas TODAVÍA están expuestas a través del _SERVER variables enumeradas.

Agregando el siguiente código en config/app.php ocultaría todas las variables de entorno de la página de gritos:

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

  • ¿Y en qué se diferencia esto de la respuesta de Raheel, además de menos la línea de cookies en su código? ¿O ha editado su respuesta después de la tuya?

    – Marcel Cozma

    28 de septiembre de 2018 a las 5:16

  • Hay una diferencia sutil pero significativa entre ‘_SERVER’ => array_keys($_SERVER) y ‘_SERVER’ => array_keys($_ENV).

    – erlangsec

    5 de octubre de 2018 a las 10:32

he hecho un paquete para resolver este problema.

Simplemente instálelo usando

composer require glaivepro/hidevara

Se eliminará la mayor parte del servidor y todas las variables env. Cualquier campo similar a una contraseña en $_POST tendrán sus valores ocultos.

También puede personalizarlo en un enfoque de lista negra o lista blanca para mostrar/ofuscar/eliminar campos como desee.

¡¡¡La solución de @jeff + @raheel es genial!!! En un proyecto reciente, descubrimos que a veces queríamos incluir en la lista blanca una o dos propiedades, por lo que, basándose en lo anterior, puede incluir en la lista blanca propiedades específicas que desea depurar con algo como:

'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()),
],

Si desea permitir que esa lista se configure a través de .env, puede hacer algo como:

'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', ""))
    ),
],

Luego, en tu .env, haz algo como:

DEBUG_SERVER_WHITELIST="APP_URL,QUERY_STRING"

¡Salud!

  • Me gustaría mencionar que esto se puede agregar en app.php

    – Jesse Naranja

    23 de julio de 2019 a las 12:13

avatar de usuario
Jenis Patel

Por lo general, para el desarrollo local, debemos establecer el APLICACIÓN_DEBUG variable de entorno a verdadero. Para que podamos tener una mejor comprensión del error de depuración y las advertencias.

Pero en el entorno de producción, este valor siempre debe ser falso. Si el valor se establece en verdadero en producción, corre el riesgo de exponer contraseñas env confidenciales a los usuarios finales de su aplicación.

A partir de Laravel 5.5.x también proporciona un solución para ello.

Solo necesitas agregar el debug_blacklist opción en su config/app.php archivo de configuración. Después de agregar esta opción, Laravel lista negra todas las claves mencionadas en debug_blacklist opción con asterisco.

Puedes usarlo de dos formas:

Método 1: claves y contraseñas ENV selectivas de la lista negra

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

Método 2: lista negra de todas las claves y contraseñas de ENV

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

Referencia tomada de: https://techjeni.com/how-to-secure-and-hide-env-passwords-from-laravel-debug-output/

  • Me gustaría mencionar que esto se puede agregar en app.php

    – Jesse Naranja

    23 de julio de 2019 a las 12:13

avatar de usuario
Silas

Laravel 5.6 no funciona para mi. pero esto funciona:

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

Agradecería una mejor solución.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad