2012-04-28 8 views
9

voglio usare phpass-0.3 in Codeigniter, ma ottengo il seguente errore a causa di open_basedir:Posso accedere a/dev/urandom con open_basedir in vigore?

Un PHP errore rilevava
Severity: Avviso
Messaggio: is_readable() [function.is leggibile ]: open_basedir restrizione in vigore. Il file (/ dev/urandom) non rientra nei percorsi consentiti : (/ home/phginep:/usr/lib/php:/usr/local/lib/php:/tmp)
Nome file: phpass-0.3 /PasswordHash.php Numero
linea: 51

seguente codice:

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; 
} 

c'è qualcosa che posso fare per ottenere intorno a questo?

risposta

0

Sembra che tu sia su hosting di hosting condiviso e hanno configurato PHP per consentire solo di accedere a file e directory all'interno del tuo account (che ha senso). Se questo è il caso, non c'è molto che tu possa fare perché l'hosting condiviso non permetterà che il cambiamento ti permetta di accedere a quella risorsa. Se si dispone di un server o VPS dedicato, è possibile modificare la configurazione PHP (php.ini) per consentire l'accesso a tale risorsa.

16

Avete alcune opzioni qui:

1 - Scaricare una discarica da una vera RNG (this one offerte discariche da una base di decadimento radioattivo) e l'uso che, tanto per essere sicuro di non continuare a leggere lo stesso nn byte. Un po 'goffo, ma un'opzione.

2 - Hanno PHP eseguire qualcosa che legge da /dev/urandom per suo conto (brutto)

3 - ripiegare su mt_rand() (anche brutto, ma ho visto questo fatto):

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

Tutte le opzioni sono goffi e brutte, sfortunatamente. La cosa migliore da fare è assicurarsi di non avere a che fare con open_basedir. Tuttavia, questo particolare fastidio potrebbe essere risolto.

Infine - non sono suscettibili di volare con il vostro ospite, ma forse vale la pena provare:

Si può chiedere il vostro ospite di fornire urandom nella vostra directory home in modo da poter leggere. Dite loro è necessario accedere urandom per generare numeri casuali in modo da poter fornire una maggiore sicurezza per gli utenti, poi chiedere loro di eseguire:

mknod urandom c 1 9 

Nella vostra directory home. L'ho appena provato sul mio server, funziona (ma root ha bisogno di farlo per te). C'è no motivo pratico per impedirti di utilizzare il generatore di numeri pseudo casuali del sistema, che potresti fare diversamente con qualcosa di diverso da PHP. Questo è in realtà il modo più semplice per consentire loro di accedere a urandom perché non richiede alcuna eccezione nella configurazione di PHP o vhost.

L'accesso vietato a /dev/random è una cosa ragionevole da fare, dal momento che /dev/random deve essere reintegrato dall'entopia del sistema disponibile (nuova) e potrebbe causare blocchi importanti sulla lettura se esauriti che potrebbero verificarsi spesso su server a basso traffico.Tuttavia, è garantito che /dev/urandom non blocchi mai dal momento che riutilizza il pool entropico interno una volta esaurito, motivo per cui si tratta di una fonte di qualità inferiore.

Nota

Non sto dicendo che l'idea di open_basedir è uno cattivo, ma rompe il codice buona troppo. Un classico chroot è molto meglio, ma più difficile, ed è per questo che ti imbatti in open_basedir molto più di un vero chroot. Come minimo, qualsiasi programma dovrebbe poter accedere ai dispositivi null, zero e urandom su un server.

+0

Davvero una bella spiegazione. – elliotrock

7

phpass sta tentando di accedere a /dev/urandom, che non è consentito nel tuo php.ini Per risolvere questo problema, è necessario sopprimere l'avviso. Per farlo, è sufficiente aggiungere @ prima is_readable, in questo modo:

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

Grazie mille! – Jonast92

+3

In realtà si sta nascondendo il problema più che risolverlo. – TechNyquist

+0

Hai ragione, ma voleva "aggirarlo" ... – 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 

e la mia phpmailer ha ora lavora in nginx chroot centos 7

php nginx RAND_BYTES stream_socket_enable_crypto php nginx stream_socket_enable_crypto Uncaught Eccezione: Impossibile aprire il dispositivo di origine php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto(): SSL

Problemi correlati