2012-07-22 2 views
5

私はis_dirへのいくつかの呼び出しをページに持っています。彼らはいつも問題なく働いてきました。PHP:open_basedir allowed path

数日前、ホスティング会社は、PHPを5.2から5.3にアップグレードしました。それ以来、is_dirにすべての私の呼び出しは次のエラー(メッセージ)をもたらしている:これは私を困惑

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

明らかに、エラーメッセージ(及び同様にphp_info)によれば、(したがってサブディレクトリを含むない後続のスラッシュとの)ディレクトリ/home/virtual/domain.comopen_basedirで有効/含まれ、is_dirを介して反復処理しようとしているファイルが全てそのフォルダの下のサブフォルダにあります。だから、なぜ彼らは許可されたパスの中にいないのですか?彼らは明らかに!

不思議なことに、このエラーはときis_dir falseを返し、ファイルがないフォルダはなく、通常のファイルである場合にのみには、すなわち、表示されます。エラーを投げずにディレクトリ全体を繰り返し処理しているようです。

類似した質問は前に投稿されました:Open_basedir restriction oddness(解決されません)。

誰もが考えている?

(注:これは共有ホストであると私はすべての管理者のアクセス権を持っていないとして、PHPの設定を変更すると、オプションではありません)

+0

これは、実際のエラーメッセージでいますか?または、特定の特殊文字があるパスにありますか? – SteAp

+0

一部のパスには、特殊文字「&」(アンパサンド)と「_」(アンダースコア)があります。しかし、大文字が特殊文字としてカウントされている場合を除き、特殊文字を含まないパスでもエラーが表示されます。特殊文字はすべてディレクトリ名にあり( 'is_dir'が' TRUE'と評価された場合は正しく解析され反復されます)、ファイル名(エラーが発生する場所)では決してありません。 –

答えて

4

既存のファイルがプレフィックスであり、存在しない部分が接尾辞ではないパスを開いたり、確認したりするときにトリガされるPHPに修正されていないバグがあります。あなたの例では、存在する接尾辞/(パスの末尾にスラッシュ)がない既存の部分があります。/home/virtual/domain.com/public_html/galleries/img/002.JPG

これはバグではないという説明があります。「これは予想される動作です。存在しないパス(スラッシュのあるもの)は、basedirの外であると見なされます」と、私は考えていません。このバグは、パスの最初の部分が既存のファイルである場合にのみトリガされます。

PHPのバグ:

3

答えは、超シンプル、まだ完全には非論理的だったが判明:

反復するパスを作成(連結)するときに、何らかの理由でスラッシュがハードコードされていましたが、上のパスが末尾にスラッシュのあるimg/002.JPG/で終わるところがあります。このスラッシュを削除すると、エラーが修正されました。これは、ディレクトリ(スラッシュの後ろにあるはずです)、ファイル(存在しないもの)だけで失敗しなかった理由も説明します。

is_dir()は、指定されたパスが既存のディレクトリを表す場合、TRUEを返す必要があります。それ以外の場合はFALSEです(指定されたファイルが存在しない場合を含む)(img/002.JPG/はありません)。

だから私はそれはちょうどそれがPHP 5.2での使用FALSE道を返すが、その代わりに、これはかなり難解とファイルがないことを率直にちょうど実に間違っ声明になりませんでした理由としてまだ少し困惑しています許可されたパスの中に...少なくともそれは今再び動作します。