Cómo resolver PHP 7.0 Polyfill: no hay un CSPRNG adecuado instalado en tu sistema - paragonie/random_compat

Este error aparece debido a la actualización de la paragonie/random_compatdependencia de su proyecto (o una dependencia de una dependencia de su proyecto) a 1.5 o una versión principal. Muchos desarrolladores se han enfrentado a estos problemas trabajando con Laravel y Symfony ( symfony/polyfill-php70). El problema básicamente, como se muestra en el mensaje, no hay un PRNG actualizado en su sistema y deberá proporcionar uno .

Un generador de números pseudoaleatorios (PRNG), también conocido como generador de bits aleatorios determinista (DRBG), es un algoritmo para generar una secuencia de números cuyas propiedades se aproximan a las propiedades de secuencias de números aleatorios. Desde la versión 1.3 de la biblioteca random_compat, el autor de la biblioteca (paragonie) advierte sobre este problema aquí .

Eliminado por openssl_random_pseudo_bytes()completo. Si está utilizando random_compat en PHP en un sistema operativo similar a Unix pero no puede acceder /dev/urandom, la versión 1.3+ arrojará un Exception. Si desea confiar en OpenSSL, no dude en escribir su propio código alternativo. (vea el fragmento en la solución n. ° 3).

En este artículo, le ofreceremos 3 posibles soluciones a este error en su proyecto.

Solución 1

Aunque no está utilizando directamente esta biblioteca, agréguela a su composer.json como dependencia. Requerir random_compat con la versión específica 1.4:

{
    "require": {
       "paragonie/random_compat": "~1.4"
   },
}

Luego ejecute composer install (o composer-update si ya está usando esta biblioteca) e intente ejecutar su proyecto nuevamente. Si no funcionó, intente degradar a 1.3, si tampoco funciona, entonces espero que tenga los derechos para modificar la configuración de PHP en su servidor y pasar a la siguiente solución posible.

Solucion 2

Es muy probable que esta solución funcione y puede ser su salvación si puede cambiar la configuración de PHP en su servidor. Como se mencionó anteriormente, necesitamos acceso a urandom en nuestro proyecto y debemos proporcionarlo usando la configuración de PHP.

Solo necesita agregar  /dev/urandom a tu propiedad open_basedir de configuración existente.

En plesk puedes realizar esta tarea fácilmente con una interfaz de usuario.

Abra plesk, navegue hasta su dominio y abra Configuración de PHP.

PHP Settings Plesk

Vaya a la configuración común y céntrese en la opción open_basedir.

Probablemente, ya hay un valor predeterminado en esa entrada, solo necesita copiar ese valor y agregar la siguiente cadena al valor existente :

Nota

Se puede acceder a los archivos en los directorios especificados mediante scripts PHP. Para separar directorios, use dos puntos (:) en Linux y un punto y coma (;) en Windows.

Parece que hay mucha gente que no lee bien:

  • Para servidores Linux (basados ​​en UNIX) : debe agregar la dev/urandomextensión con dos puntos (:) p. Ej. :/dev/urandom
  • Para servidores Windows : debe agregar el dev/urandomcon un punto y coma (;) p. Ej.;/dev/urandom
# En linux usa : (dos puntos)
:/dev/urandom

# En windows usa ; (punto y coma)
;/dev/urandom

Puedes ver un ejemplo de esta solución en un servidor Plesk con Ubuntu (Unix) en la siguiente imagen:

Plesk manager open_basedir path

Finalmente, guarde sus cambios e intente acceder a su proyecto nuevamente. Si está seguro de que agrega la extensión urandom correctamente y no funciona, continúe con la última solución.

Solución 3

Si estás en este punto porque ninguna de las posibles soluciones anteriores no te funcionó, déjame decirte que tienes prisa porque no te quedan muchas opciones . Como ninguno de los pasos anteriores funcionó para usted, solo le quedan las siguientes opciones:

A. Bajar version a tu proyecto

Si su proyecto ya estaba funcionando y decidió actualizar su marco (Symfony o laravel, etc.), deberás cambiar a una versión anterior, ya que no podrá brindar soporte para urandom (random_bytesfunción).

B. Escribe tu propio respaldo para random_bytes

Como mencionamos, la biblioteca ya no depende de la función openssl_random_pseudo_bytes y utiliza en su lugar random_bytes(función que lanza la excepción). El autor dice que en la versión 1.3 , puede escribir su propio respaldo para usar openss_random_pseudo_bytesnuevamente modificando la biblioteca y creando una declaración try and catch donde random_bytesse usa:

<?php
try {
    $bytes = random_bytes(32);
} catch (Exception $ex) {
    $strong = false;
    $bytes = openssl_random_pseudo_bytes(32, $strong);
    if (!$strong) {
        throw $ex;
    }
}

Tenga en cuenta que en las plataformas Windows que utilizan PHP <5.3.0, la función openssl_random_pseudo_bytesno está disponible, por lo tanto, deberá realizar otra solución mediante el control CAPICOM ActiveX. Aunque probablemente nadie que use PHP 5.3 nunca enfrentará esta excepción (ya que todos los proyectos modernos requieren una versión de PHP superior), puede consultar este fragmento para obtener más información en caso de que esté usando PHP <5.3.0 .

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable