この記事で共有した内容は、PHP の set_error_handler() 関数の使用法を詳しく説明したものです。必要な方は参照してください。set_error_handler の機能は、エラーパスの漏洩
間違ったパスの漏洩とは何ですか?
プログラムを書くと必ず問題が起こります(問題は頻繁に起こります)、PHPがエラーに遭遇すると、エラースクリプトの場所、行数、理由を教えてくれます
これは多くの人が言うことです大したことはありません。実際、デバッグ段階では、これは実際には問題ではなく、エラー パスを示すことが必要だと思います。
しかし、一部の侵入者にとって、実際のパスが漏洩した場合の影響は想像を絶するものであり、実際、多くのサーバーがこの問題を抱えています。
一部のネットワーク管理者は、問題を解決するために、PHP 設定ファイルの display_errors を Off に設定するだけですが (私たちがそうしたようです)、この方法はあまりにも消極的すぎると思います。
場合によっては、デバッグのためにエラー情報を返すために PHP が必要になることがあります。また、何か問題が発生した場合は、ユーザーに説明したり、別のページに移動したりする必要がある場合もあります。
それで、解決策は何でしょうか?PHP は 4.1.0 以降、カスタム エラー処理ハンドラー用の関数 set_error_handler() を提供していますが、それを知っているスクリプト作成者はほとんどいません。
set_error_handler は次のように使用されます:
string set_error_handler ( callback error_handler [, int error_types])
今度は、カスタム エラー処理を使用して実際のパスを除外します。
例: 変数 $admin があるとします。訪問者が管理者であるかどうかを判断するために使用されます (この判断は IP またはログイン ユーザー ID によって行うことができます)
Php コード
//admin为管理员的身份判定,true为管理员。 //自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。 function my_error_handler($errno,$errstr,$errfile,$errline) { //如果不是管理员就过滤实际路径 if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n"; echo "程序已经停止运行,请联系管理员。"; //遇到Error级错误时退出脚本 exit; break; case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n"; break; default: //不显示Notice级的错误 break; } }
このようにしてエラー処理関数をカスタマイズしました。では、エラー処理をこのカスタム関数にどのように引き渡すのでしょうか?
Php コード
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");
とても簡単です。このようにして、セキュリティとデバッグの利便性の間の矛盾をうまく解決できます。また、Web サイトのスタイルに合わせてエラー メッセージをより美しくすることも考えられます。
著者は注意が必要な 2 つの点を指摘しました。私たちの同胞の注意を引くことを願って、ここに投稿します:
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING はこのハンドルでは使用されません処理済み、つまり最もオリジナルな方法で表示されます。ただし、これらのエラーはコンパイル エラーまたは PHP カーネル エラーによって発生するものであり、通常の状況では発生しません。
set_error_handler()を使用すると、error_reporting()が無効になります。つまり、すべてのエラー (上記のエラーを除く) は、処理のためにカスタム関数に渡されます。
最後に、原作者が別の例を挙げました(なんて真面目で責任感のある人なんだろう。笑)
Php代码
//先定义一个函数,也可以定义在其他的文件中,再用require()调用 function myErrorHandler($errno, $errstr, $errfile, $errline) { //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } //下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 $link_id=@mysql_pconnect("localhost:3333","root","password"); set_error_handler(myErrorHandler); if (!$link_id) { trigger_error("出错了", E_USER_ERROR); }
嗯,根据上面的那些解释,以及原作者认真负责的态度,我想如果我还学不会这个set_error_handler函数,那么我真该去撞墙了。
好了,总结一下,下面是 set_error_handler 三种用法:
Php代码
class CallbackClass { function CallbackFunction() { // refers to $this } function StaticFunction() { // doesn't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: 1: set_error_handler('NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction 2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction 3: $o =& new CallbackClass(); set_error_handler(array($o, 'CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 4. $o = new CallbackClass(); // The following may also prove useful: class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, 'CallbackFunction')); // the & is important } function CallbackFunction() { // refers to $this } }
以上がPHPのset_error_handler()関数の使い方の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。