0
$admpage=md5($_SERVER[DOCUMENT_ROOT]).'.php';
if(!@include($admpage)){echo "error opening Adminpage";}

したがって、そのようなファイルがない場合は、エラーが発生するはずですerror opening Adminpage

しかし、インクルードされたファイルにコード内のエラーがある場合、何も表示されません。

つまり、インクルード中はエラー報告をオフにし、インクルード ファイルの実行中はオンにする必要があります。

PS
試してみeval()ましたが、それははるかに悪いです@include()

PPS
ファイルを含める必要がありますが、エラーが発生した場合(組み込み中または実行中)、エラーを表示しますが、ファイル名は表示しません

4

3 に答える 3

2

あなたの目標は、存在しないファイルを含めてエラーメッセージを抑制することです。

これを行う方法は次のとおりです。

$old = ini_set('display_errors', 0);  // Do not show errors to client
$fileExists = file_exists($someFile) && is_readable($someFile);
ini_set('display_errors', $old); // Restore old value
if (!$fileExists)
   die('Error opening admin page');
include($someFile);

なぜ多くのステップがあるのですか?

file_existsまたis_readable、特定の条件でエラー メッセージを出力します:safe_modeまたはopen_basedir制限の問題がある可能性があります (まだ誰もが PHP 5.3 を使用しているわけではありません)。サーバーも実行される可能性がありsuPHP、ファイルも読み取れなくなります。

なぜ間違っているのですか?

あなたのコンセプト:疑似認証のために隠蔽されたファイルの名前に依存することは、「隠蔽によるセキュリティ」と呼ばれます。たとえば、ブラウザの履歴にアクセスできる人は誰でも URL を知っています。これはあまり安全ではありません...

私の答え: 単純にオフにすることは、ゼロdisplay_errorsに設定するのと同じくらい安全です。error_reporing例: カスタム エラー ハンドラがインストールされると、これらの設定は両方とも「無視」されます。これらの値を適宜チェックするのは、カスタム エラー ハンドラの役割です。

php.ini本番環境と開発環境の両方で異なる設定を使用することを検討してください。最初のエラー メッセージは理想的にはまったく表示されませんが、後者のエラー メッセージはすべて表示されます。


よく読んで:

于 2013-09-29T13:40:28.433 に答える
0

何についてfile_existsですか?

if(!file_exists($admpage)){echo "error opening Adminpage";}

このようにインクルード中にエラー報告を本当にオフにしたい場合@include("script.php"); は、ファイル内のコードを関数でラップします。たとえばmyFunc()、インクルードの後に​​それを呼び出します。

于 2013-09-29T13:14:41.597 に答える
0

以下を使用して、ファイルが存在する場合にのみ含めます。

if (file_exists($admpage) && is_readable($admpage)) {
  include($admpage);
}
于 2013-09-29T13:16:42.310 に答える