tutorial nova español ejemplos curso php laravel

php - español - laravel nova



Random RuntimeException: los únicos cifrados compatibles son AES-128-CBC y AES-256-CBC con la longitud de clave correcta (3)

El problema ocurre cuando se utilizan versiones seguras de subprocesos de PHP en servidores web de múltiples subprocesos, en lugar de servidores web de múltiples procesos. Puede leer sobre el tema un poco más sobre el tema de Github aquí , el tema de Github aquí y un informe de error de PHP aquí . Hay algunos enlaces más, pero están separados de los pocos que publiqué.

La idea básica es que con el servidor web de múltiples subprocesos, tiene un solo proceso que maneja múltiples subprocesos. Sin embargo, los putenv() / getenv() no son seguros para subprocesos y cambian las variables de entorno en el nivel del proceso, por lo que todos los subprocesos bajo ese proceso se ven afectados.

Entonces, terminas con algo como esto: (como se describe en este número ):

Request 1: {starts --- loads env --- work --- finishes} Request 2: {starts ----- loads env --- work --- finishes}

Entonces, la solicitud 1 entra, carga bien el ambiente y se pone a trabajar. Mientras la solicitud 1 está funcionando, la solicitud 2 entra y comienza en otro hilo. Antes de que la solicitud 2 lea las variables de entorno, la solicitud 1 finaliza y PHP borra todas las variables establecidas por putenv() . Ahora, la solicitud 2 intenta leer el entorno, pero se null porque las variables se borraron cuando finalizó la solicitud 1.

Este problema puede ser mitigado de dos maneras:

  1. No use un archivo .env en producción. Establece las variables de entorno directamente y deshabilita phpdotenv. Esto también es sugerido por el propio paquete :

    phpdotenv está hecho para entornos de desarrollo y, por lo general, no debe utilizarse en la producción. En producción, las variables de entorno reales deben configurarse de modo que no haya sobrecarga al cargar el archivo .env en cada solicitud.

  2. Nunca use el método env() fuera de los archivos de configuración, y asegúrese de guardar en caché sus archivos de configuración. Al utilizar este método, el entorno se lee una vez: cuando crea el caché del archivo de configuración. Cada solicitud web real leerá los datos del caché y las variables de entorno nunca se volverán a tocar.

Tengo el mismo problema con Laravel 5.3 (en el servidor de Windows). Hice todos los intentos posibles: verifiqué el archivo .env, la configuración, la generación de claves artesanales nuevas, el caché: claro, la configuración: claro, la actualización del editor, pero el problema persiste al azar.

Tenga en cuenta que el mismo código con exactamente la misma versión de apache, mysql, php, no genera este problema en Mac OS.

Descubrí que la clave (primer parámetro de Concriptor de cifrado) aparece "a veces" vacía y, por supuesto, falla. La mayoría de las veces, la clave es correcta, pero al azar la clave llega vacía desde EncryptionServiceProvider que, a su vez, la solicita a la configuración de la aplicación.

Así que la única solución que funcionó para mí fue agregar un if ($key) en EncryptionServiceProvider para que el constructor de cifrado no se llame con una clave vacía.

Por supuesto, no es una solución "limpia" ni explica el problema, pero al menos evita encontrar el archivo de registro con el error:

RuntimeException: los únicos cifrados compatibles son AES-128-CBC y AES-256-CBC y las páginas se muestran correctamente.

Si se trata de un error de Laravel, no lo sé, pero, por supuesto, si alguien pudiera explicarlo, me encantaría saberlo.

A continuación está mi clase modificada: acabo de agregar la línea if ($key) antes del new Encrypter :

class EncryptionServiceProvider extends ServiceProvider { /** * Register the service provider. * * @return void */ public function register() { $this->app->singleton(''encrypter'', function ($app) { $config = $app->make(''config'')->get(''app''); // If the key starts with "base64:", we will need to decode the key before handing // it off to the encrypter. Keys may be base-64 encoded for presentation and we // want to make sure to convert them back to the raw bytes before encrypting. if (Str::startsWith($key = $config[''key''], ''base64:'')) { $key = base64_decode(substr($key, 7)); } if ($key) return new Encrypter($key, $config[''cipher'']); }); } }

Más detalles y registro de backtrace:

Por supuesto, mientras escribía, verifiqué el archivo .env, la configuración, la nueva generación de clave artesanal, el caché: claro, la configuración: claro, la actualización del compositor. Esto está bien ya que funciona el 99% del tiempo, pero al azar recibo el error.

Aquí el rastro de vuelta:

[2017-01-09 10:25:40] test.ERROR: RuntimeException: los únicos cifrados admitidos son AES-128-CBC y AES-256-CBC con la longitud de clave correcta. en C: / Apache24 / htdocs / sph / vendor / laravel / framework / src / Illuminate / Encryption / Encrypter.php: 43

Traza de pila

#0 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php(27): Illuminate/Encryption/Encrypter->__construct('''', ''AES-256-CBC'') #1 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(746): Illuminate/Encryption/EncryptionServiceProvider->Illuminate/Encryption/{closure}(Object(Illuminate/Foundation/Application), Array) #2 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(644): Illuminate/Container/Container->build(Object(Closure), Array) #3 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(709): Illuminate/Container/Container->make(''encrypter'', Array) #4 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(864): Illuminate/Foundation/Application->make(''encrypter'') #5 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(819): Illuminate/Container/Container->resolveClass(Object(ReflectionParameter)) #6 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(788): Illuminate/Container/Container->getDependencies(Array, Array) #7 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Container/Container.php(644): Illuminate/Container/Container->build(''App//Http//Middle...'', Array) #8 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(709): Illuminate/Container/Container->make(''App//Http//Middle...'', Array) #9 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(127): Illuminate/Foundation/Application->make(''App//Http//Middle...'') #10 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): Illuminate/Pipeline/Pipeline->Illuminate/Pipeline/{closure}(Object(Illuminate/Http/Request)) #11 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #12 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate/View/Middleware/ShareErrorsFromSession->handle(Object(Illuminate/Http/Request), Object(Closure)) #13 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): Illuminate/Pipeline/Pipeline->Illuminate/Pipeline/{closure}(Object(Illuminate/Http/Request)) #14 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #15 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate/Session/Middleware/StartSession->handle(Object(Illuminate/Http/Request), Object(Closure)) #16 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): Illuminate/Pipeline/Pipeline->Illuminate/Pipeline/{closure}(Object(Illuminate/Http/Request)) #17 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #18 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse->handle(Object(Illuminate/Http/Request), Object(Closure)) #19 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): Illuminate/Pipeline/Pipeline->Illuminate/Pipeline/{closure}(Object(Illuminate/Http/Request)) #20 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #21 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Router.php(655): Illuminate/Pipeline/Pipeline->then(Object(Closure)) #22 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Router.php(629): Illuminate/Routing/Router->runRouteWithinStack(Object(Illuminate/Routing/Route), Object(Illuminate/Http/Request)) #23 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Router.php(607): Illuminate/Routing/Router->dispatchToRoute(Object(Illuminate/Http/Request)) #24 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(268): Illuminate/Routing/Router->dispatch(Object(Illuminate/Http/Request)) #25 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate/Foundation/Http/Kernel->Illuminate/Foundation/Http/{closure}(Object(Illuminate/Http/Request)) #26 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #27 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode->handle(Object(Illuminate/Http/Request), Object(Closure)) #28 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): Illuminate/Pipeline/Pipeline->Illuminate/Pipeline/{closure}(Object(Illuminate/Http/Request)) #29 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate/Routing/Pipeline->Illuminate/Routing/{closure}(Object(Illuminate/Http/Request)) #30 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(150): Illuminate/Pipeline/Pipeline->then(Object(Closure)) #31 C:/Apache24/htdocs/sph/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(117): Illuminate/Foundation/Http/Kernel->sendRequestThroughRouter(Object(Illuminate/Http/Request)) #32 C:/Apache24/htdocs/sph/public/index.php(53): Illuminate/Foundation/Http/Kernel->handle(Object(Illuminate/Http/Request)) #33 {main}


Es tan simple, copie la APP_KEY del archivo .env a config/app.php -> key o ejecute el siguiente comando:

php artisan key:generate


Instalé Laravel 5.3 y no encontré un archivo .env allí. Y boom ... Ese era el problema. Creé el archivo .env en la raíz de la aplicación y lo ejecuté

php clave artesana: generar

en el terminal y generó la base 64 codificada cadena en el terminal. Copie esa cadena en el archivo .env como

APP_KEY = base64: ********************************************** **

donde **** se genera la cadena codificada. Ejecute la aplicación de nuevo y debería funcionar.