2012-04-28 14 views
9

私はCodeIgniterのでphpass-0.3を使用したいが、私は原因open_basedirに次のエラーが表示されます。open_basedirを使って/ dev/urandomにアクセスできますか?

A PHPエラーが
重大度発生しました:警告
メッセージ:is_readable()[function.is可読を]:open_basedir の制限が適用されます。 (/ home/phginep:/ usr/lib/php:/ usr/local/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 - (this one申し出が放射性崩壊に基づいて1からダンプ)真のRNGからダンプをダウンロードし、それを使用して、ちょうどあなたが同じことを読み続けていないことを確認してくださいnnバイト。 clunky、しかしオプションの種類。

2 - 持っているPHPが代わって/dev/urandomから読み込む何か(UGLY)

3を実行 - (醜いまた、私はこれが行わ見てきました)mt_rand()にフォールバック:

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

残念ながら、すべてのオプションが厄介で醜いです。最高のことは、open_basedirに対処する必要がないことを確認することです。それでも、このような厄介な問題は回避できます。

最後に - あなたのホストで飛行する可能性はないが、試してみる価値があるかもしれない:

あなたはそれを読むことができるようにあなたのホームディレクトリにurandomを提供するために、あなたのホストを依頼することができます。実行するためにそれらを求める、その後、あなたはあなたのユーザーのための優れたセキュリティを提供できるように乱数を生成するurandomのにアクセスする必要があり、それらを教える:あなたのホームディレクトリで

mknod urandom c 1 9 

を。私はちょうど私自身のサーバー上でそれを試して、それは動作しますが(しかし、ルートはあなたのためにそれを行う必要があります)。 システムの擬似乱数ジェネレータを使用しないようにする実用的な理由があります。これは、PHP以外の方法で行うことができます。実際には、urandomにアクセスできるようにする最も簡単な方法です。PHPやvhostの設定で例外が必要ないためです。 /dev/randomへのアクセスの禁止

/dev/randomが利用可能(新)システムのエントロピーによって補充しなければならないと排出場合重要なことは、低トラフィックのサーバー上で頻繁に起こる可能性が読んでブロックすることが原因かもしれないので、行うには合理的なものです。しかし、/dev/urandomは、一度使い尽くされた内部エントロピープールを再利用するだけなので、決してブロックされないことが保証されています。これは品質の低いソースです。

私はopen_basedirのが悪いものであるアイデアを言っていないんだけど、それはあまりにも良いコードを破ります。古典的なchrootははるかに優れていますが、より困難です。そのため、あなたは実際のchrootよりもはるかに多くopen_basedirに入ります。サーバー上のnull,zeroおよびurandomデバイスにアクセスできるプログラムは、最低限です。

+0

本当に素敵な説明。 – elliotrock

7

phpassが/dev/urandomにアクセスしようとしていますが、これは許可されていませんphp.ini この問題を解決するには、警告を抑制する必要があります。そのためには、ちょうどこのように、is_readable@を追加します。

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

ありがとう! – Jonast92

+3

実際には、問題を解決する以上にその問題を隠しています。 – TechNyquist

+0

あなたは正しいですが、彼女はそれを "周りたい"と思っていました... – 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 

と私phpmailerのは今7

PHPのnginxののRAND_BYTESが PHP nginxのstream_socket_enable_crypto キャッチされない例外をstream_socket_enable_crypto nginxのののchrootのCentOSで働いています:ソースデバイスを開くことができません PHP nginx RAND_BYTES stream_socket_enable_crypto stream_socket_enable_crypto():SSL

関連する問題