2012-04-28 7 views
9

Quiero usar phpass-0,3 en CodeIgniter, pero me sale el siguiente error debido a open_basedir:¿Puedo acceder/dev/urandom con open_basedir en efecto?

Un PHP error fue encontrado
Severidad: Aviso
mensaje: is_readable() [function.is legible ]: open_basedir restricción en vigor. El archivo (/ dev/urandom) no se encuentra dentro de la (s) ruta (s) permitidas (/ home/phginep:/usr/lib/php:/usr/local/lib/php:/tmp)
Nombre de archivo: phpass-0.3 /PasswordHash.php Número
Línea: 51

siguiente código:

function get_random_bytes($count) 
{ 
    $output = ''; 
    if (is_readable('/dev/urandom') && //Line Number: 51 
     ($fh = @fopen('/dev/urandom', 'rb'))) { 
     $output = fread($fh, $count); 
     fclose($fh); 
    } 

    if (strlen($output) < $count) { 
     $output = ''; 
     for ($i = 0; $i < $count; $i += 16) { 
      $this->random_state = 
       md5(microtime() . $this->random_state); 
      $output .= 
       pack('H*', md5($this->random_state)); 
     } 
     $output = substr($output, 0, $count); 
    } 

    return $output; 
} 

¿hay algo que pueda hacer para evitar esto?

Respuesta

0

Parece que está en hosting de alojamiento compartido y que han configurado PHP para que solo le permita acceder a archivos y directorios dentro de su cuenta (lo cual tiene sentido). Si este es el caso, no hay mucho que pueda hacer ya que el alojamiento compartido no permitirá el cambio para permitirle acceder a ese recurso. Si tiene un servidor dedicado o VPS, puede modificar su configuración de PHP (php.ini) para permitir el acceso a ese recurso.

16

Usted tiene algunas opciones aquí:

1 - Descargar un volcado de un verdadero generador de números aleatorios (this one ofertas vertederos de uno basado en la desintegración radiactiva) y el uso que, sólo asegúrese de que usted no mantiene la lectura de la misma nn bytes. Un poco torpe, pero una opción.

2 - Tener el PHP ejecutar algo que se lee de /dev/urandom en su nombre (FEO)

3 - caer de nuevo mt_rand() (también feo, pero he visto este hecho):

for ($i = 0; $i < $count/8; $i++) { 
    $output .= dechex(mt_rand(0, 0x7fffffff)); 
} 

Todas las opciones son torpes y desagradables, desafortunadamente. Lo mejor que puede hacer es asegurarse de no tener que lidiar con open_basedir. Aún así, esta molestia particular podría ser solucionada.

Por último - no es probable que volar con su anfitrión, pero quizás vale la pena intentarlo:

Usted puede preguntar a su huésped para proporcionar urandom en su directorio personal para que pueda leerlo. Dígales que necesita acceder a urandom para generar números aleatorios para que pueda proporcionar una mejor seguridad para sus usuarios, a continuación, pedir que se ejecuten:

mknod urandom c 1 9 

en su directorio personal. Lo probé en mi propio servidor, funciona (pero root necesita hacerlo por ti). Hay no razón práctica para evitar el uso del generador de números pseudoaleatorios del sistema, que de otro modo podría hacer con cualquier otra cosa que no sea PHP. De hecho, esta es la manera más fácil para que puedan tener acceso a urandom porque no requiere excepciones en la configuración de PHP o vhost.

Dejar de usar el acceso a /dev/random es una medida razonable, ya que /dev/random debe reponerse con la entropía del sistema disponible (nueva) y puede causar bloqueos importantes al leer si está agotada, lo que podría ocurrir frecuentemente en servidores con poco tráfico.Sin embargo, se garantiza que el bloque /dev/urandom nunca se bloqueará, ya que solo reutiliza el grupo de entropía interno una vez que se haya agotado, por lo que es una fuente de menor calidad.

Nota

No estoy diciendo que la idea de open_basedir es una mala, pero rompe código buena también. Un clásico chroot es mucho mejor, pero más difícil, por lo que te encuentras con open_basedir mucho más que con un verdadero chroot. Como mínimo, cualquier programa debe poder acceder a los dispositivos null, zero y urandom en un servidor.

+0

Explicación realmente agradable. – elliotrock

7

phpass está intentando acceder /dev/urandom, que no está permitido en su php.ini Para resolver este problema, debe suprimir la advertencia. Para ello, sólo tiene que añadir @ antes is_readable, así:

... 
@is_readable('/dev/urandom') 
... 
+0

¡Muchas gracias! – Jonast92

+3

En realidad, estás ocultando el problema más que resolverlo. – TechNyquist

+0

Tienes razón, pero ella quería "moverse" ... – SuN

0
cd /nginx/chroot/ 
touch random 
touch urandom 
mount --bind /dev/random /nginx/chroot/dev/random 
mount --bind /dev/urandom /nginx/chroot/dev/urandom 

y mi phpmailer ahora se trabaja en nginx centos chroot 7

RAND_BYTES php nginx stream_socket_enable_crypto php nginx stream_socket_enable_crypto Excepción no detectada: No se puede abrir el dispositivo de origen php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto(): SSL