6

ページにいくつかの呼び出しがis_dirあります。彼らはいつも問題なく働いてきました。

数日前、ホスティング会社は 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.com(末尾にスラッシュがないため、サブディレクトリを含む) は に含まれている/有効になっており、反復しようとしopen_basedirているファイルis_dirはすべて、そのフォルダーの下のサブフォルダーにあります。では、なぜそれらは許可されたパス内にないのでしょうか? 明らかにそうです!

不思議なことに、このエラーは が false を返す場合、つまりファイルがフォルダではなく通常のファイルの場合にのみ表示されるようです。エラーをスローすることなく、ディレクトリを問題なく反復処理しているようです。is_dir

以前ここに投稿された同様の質問: Open_basedir 制限の奇妙さ(解決策が見つかりません)。

誰にもアイデアはありますか?

(注:これは共有ホストであり、管理者アクセス権がないため、PHP設定を変更することはできません)

4

2 に答える 2

4

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

これはバグではないという説明があります。存在しない非パス (スラッシュが付いているパス) は、basedir の外部と見なされます。」このバグは、パスの最初の部分が既存のファイルである場合にのみ発生します。

PHP のバグ:

于 2013-03-15T15:35:01.297 に答える
4

答えは非常に単純ですが、完全に非論理的であることがわかりました。

繰り返し処理するパスを作成 (連結) するときに、何らかの理由で末尾のスラッシュをハードコーディングしました。上記のパスimg/002.JPG/が最後にスラッシュで終わっていることに注意してください。このスラッシュを削除すると、エラーが修正されました。これは、ディレクトリ (末尾にスラッシュがあると想定されている) では失敗せず、ファイル (そうでない) でのみ失敗した理由も説明しています。

指定されたパスが既存のディレクトリを表している場合は、PHP のドキュメントに記載されているようにis_dir()返されます。指定されたファイルが存在しない場合を含め、その他のすべての場合 (存在しTRUEない場合)。FALSEimg/002.JPG/

FALSEPHP 5.2 で使用されていた方法を返さなかった理由について、私はまだ少し戸惑っています。少なくとも今は再び機能します。

于 2012-07-25T09:19:44.440 に答える