2012-04-28 16 views
9

I CodeIgniter'da phpass 0.3 kullanmak isteyen, ancak nedeniyle open_basedir aşağıdaki hata:/dev/urandom etkinliğine open_basedir erişebilir miyim?

bir PHP hata
Önem karşılaşıldı :
Uyarı Mesajı: is_readable() [function.is okunabilir ]: open_basedir kısıtlama yürürlükte. Dosya (/ dev/urandom) izin verilen yolunda değil: (/ home/phginep:/usr/lib/php:/usr/yerel/lib/php:/tmp)
Dosya adı: phpass-0.3 /PasswordHash.php
Satır sayısı: bunu aşmanın yapabileceğim bir şey

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

var mı: 51

kod takiben?

cevap

0

Paylaşılan barındırma üzerinde barındırma işinde olduğunuza ve PHP'yi yalnızca hesabınızdaki dosyalara ve dizinlere erişmenize izin verecek şekilde yapılandırmışsınız (bu mantıklıdır). Bu durumda, paylaşımlı barındırma, bu kaynağa erişmenize izin vermek için değişikliğe izin vermeyeceği için yapabileceğiniz fazla bir şey yoktur. Özel bir sunucunuz veya VPS'niz varsa, bu kaynağa erişime izin vermek için PHP yapılandırmanızı (php.ini) değiştirebilirsiniz.

16

Burada bazı seçenekler vardır:

1 - (this one teklifler radyoaktif çürüme dayalı birinden döker) gerçek bir RNG bir dökümü indirin ve bunu kullanın, sadece aynı okumaya devam etmediğinden emin olun nn bayt. Bir tür tıknaz, ama bir seçenek.

2 - mt_rand() geri Güz (Ayrıca çirkin, ama ben bu işi gördüm) - Var PHP

3 (ÇİRKİN) kendi adına /dev/urandom okur şey yürütün:

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

Tüm seçenekler maalesef tıkalı ve çirkin. Yapılacak en iyi şey, open_basedir ile uğraşmak zorunda olmadığınızdan emin olabilirsiniz. Yine de, bu özel sıkıntı etrafında çalışılabilir.

Nihayet - barındırıcınızı uçmak için muhtemel ama bir deneyin belki değmez: Sen bunu okuyabilmek için ev dizininde urandom sağlamak için ev sahibi sorabilir

. çalıştırmak için onlara sormak sonra, size kullanıcılar için daha iyi güvenlik sağlayabilir böylece rasgele sayı üretmek için urandom erişmesi gereken söyle: Ev dizininde

mknod urandom c 1 9 

. Sadece kendi sunucumda denedim, işe yarıyor (ama kök senin için bunu yapmalı). Sistemin sözde rasgele sayı üretecini kullanmanıza engel olmak için no no'lu pratik bir sebebi vardır, aksi takdirde PHP'den başka bir şeyle yapabilirsiniz. Bu, aslında sizin için PHP veya vhost yapılandırmasında istisnalar gerektirmediğinden, urandom'a erişmenize izin vermenin en kolay yoludur. /dev/random/dev/random'a erişimi engellemek makul bir şeydir, çünkü /dev/random mevcut (yeni) sistem entropisi ile doldurulmalıdır ve düşük trafik sunucularında sık sık meydana gelebilecekse önemli şeylerin okumanın engellenmesine neden olabilir.Bununla birlikte, /dev/urandom, bir kez tükendiğinde iç entropi havuzunu yeniden kullandığı için hiçbir zaman engellenmeyecektir, bu yüzden daha az kaliteli bir kaynaktır.

Not

Ben open_basedir ait kötü biridir fikri demiyorum, ama çok iyi kodu kırar. Klasik bir chroot çok daha iyi, ancak daha zor, bu yüzden gerçek bir chroot yapmaktan çok daha fazla open_basedir'a giriyorsunuz. En azından, herhangi bir program bir sunucuda null, zero ve urandom aygıtlarına erişebilmelidir.

+0

Gerçekten güzel bir açıklama. – elliotrock

7

phpass /dev/urandom ürününe erişmeye çalışmaktadır, bu php.ini ürününüzde buna izin verilmez. Bu sorunu çözmek için, uyarıyı bastırmalısınız. böylece, sadece bu gibi is_readable önce @ eklerim için:

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

Çok teşekkür ederim! – Jonast92

+3

Aslında sorunu çözmekten çok daha fazla saklıyorsunuz. – TechNyquist

+0

Haklısın, ama "etrafta dolaşmak" istedi ... – 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 

ve benim phpmailer şimdi nginx chroot centos 7

php nginx RAND_BYTES stream_socket_enable_crypto php nginx stream_socket_enable_crypto Yakalanmayan İstisna çalışan etti: Kaynak aygıt açılamıyor php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto(): SSL

İlgili konular