2012-04-28 88 views
9

我想在笨使用phpass-0.3,但我得到了下面的錯誤由於open_basedir我可以通過open_basedir訪問/ dev/urandom嗎?

一個PHP錯誤遇到
嚴重性:警告
消息:is_readable()[function.is可讀]:open_basedir 限制生效。文件(/ dev/urandom)不在允許的 路徑中:(/ home/phginep:/ usr/lib/php:/ tmp)
文件名:phpass-0.3 /PasswordHash.php
行號:51

以下代碼:

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

有什麼我可以做的來解決這個問題?

回答

0

看起來你在共享主機託管,他們已經配置PHP只允許你訪問您的帳戶(這是有道理的)內的文件和目錄。如果是這種情況,您可以做的事情不多,因爲共享主機不允許更改以允許您訪問該資源。如果您有專用服務器或VPS,您可以更改您的PHP配置(php.ini)以允許訪問該資源。

16

你有一些選擇這裏:

1 - 從一個真正的RNG下載轉儲(this one可以從一個基於放射性衰變轉儲)和使用,只是要確保你不保持讀取相同的nn個字節。有點笨重,但是一種選擇。

2 - 讓PHP執行的東西,從/dev/urandom其代表(醜陋的)讀

3 - 依傍mt_rand()(也醜,但我已經看到這種情況):

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

不幸的是,所有選項都很笨重和醜陋。最好的做法是確保你不必處理open_basedir。但是,這個特別的煩惱可以解決。

最後 - 不太可能與你的主機飛翔,但也許值得一試:

你可以問問你的主機在你的home目錄提供urandom這樣你就可以讀取它。告訴他們你需要訪問urandom來產生隨機數,所以你可以爲你的用戶提供更好的安全性,然後讓用戶運行:

mknod urandom c 1 9 

在你的主目錄。我只是在我自己的服務器上嘗試過,它可以工作(但是根需要爲你做)。有一些實際的原因讓你不能使用系統的僞隨機數發生器,除此之外,你可以用其他任何方法來處理這個問題。這實際上是讓他們訪問urandom的最簡單方式,因爲它不需要在PHP或vhost配置中爲您提供例外。

禁止訪問/dev/random是做一件合理的事,因爲/dev/random必須由可用(新)系統的熵進行補充,並可能導致重要的事情來阻止上閱讀,如果用盡可能低業務服務器經常發生。然而,/dev/urandom保證不會阻塞,因爲它只是一次耗盡內部熵池,這就是爲什麼它是一個較小的質量來源。

注意

我不是說了想法open_basedir是一個壞的,但它打破代碼了。經典的chroot要好得多,但更難,這就是爲什麼你碰到open_basedir的原因遠遠大於你真正的chroot。至少,任何程序都應該能夠訪問服務器上的nullzerourandom設備。

+0

真的很好的解釋。 – elliotrock 2015-01-01 11:49:22

7

phpass正試圖訪問/dev/urandom,這是不允許在您的php.ini 要解決此問題,您必須禁止警告。要做到這一點,只是is_readable前加@,像這樣:

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

非常感謝! – Jonast92 2013-06-09 15:51:12

+3

其實你隱藏的問題不僅僅是解決問題。 – TechNyquist 2015-07-09 07:26:51

+0

你說得對,但她想「解決」它...... – SuN 2015-09-23 08:13:58

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

和我的PHPMailer在nginx的chroot環境的CentOS 7

PHP nginx的RAND_BYTES stream_socket_enable_crypto PHP nginx的stream_socket_enable_crypto 未捕獲的異常現在的工作:無法打開源設備 php nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto():SSL

相關問題