프로그램을 작성하다 보면 필연적으로 문제가 생기고(문제가 자주 발생함) PHP에서 오류가 발생하면 오류 스크립트의 위치, 줄 번호, 이유를 알려줍니다. 많은 사람들이 별 문제가 아니라고 말합니다. 실제로 디버깅 단계에서는 이는 전혀 문제가 되지 않으며 오류 경로를 제공하는 것이 필요하다고 생각합니다.
그러나 일부 침입자에게는 이 정보가 매우 중요하므로 실제 경로 유출로 인한 결과는 상상할 수 없습니다. 실제로 많은 서버에서 이러한 문제가 발생합니다. 일부 네트워크 관리자는 문제를 해결하기 위해 단순히 PHP 구성 파일의 display_errors를 Off로 설정했지만(우리가 이렇게 한 것 같습니다), 이 방법은 너무 부정적이라고 생각합니다.
때때로 디버깅을 위해 오류 정보를 반환하려면 PHP가 꼭 필요할 때가 있습니다. 그리고 문제가 발생하면 사용자에게 설명을 제공하거나 다른 페이지로 이동해야 할 수도 있습니다.
그렇다면 해결책은 무엇인가요?
set_error_handler()
PHP는 4.1.0부터 사용자 정의 오류 처리 핸들러를 위해 set_error_handler() 함수를 제공했지만 이를 아는 스크립트 작성자는 거의 없습니다. set_error_handler 함수는 오류 경로가 유출되는 것을 방지할 수 있으며, 물론 다른 기능도 있습니다.
- 을 사용하여 오류를 마스킹할 수 있습니다. 오류가 발생하면 일부 정보가 사용자에게 노출되며, 이는 해커가 웹사이트를 공격하는 도구가 될 가능성이 매우 높습니다. 둘째, 사용자가 자신의 레벨이 매우 낮다고 느끼게 만듭니다.
- 오류 정보를 기록하고 제작 환경의 문제점을 적시에 발견할 수 있습니다.
- 오류가 발생하면 더 나은 사용자 경험을 제공하기 위해 미리 정의된 오류 페이지를 표시하고 이동할 수 있습니다.
- 을 디버깅 도구로 사용할 수 있습니다. 프로덕션 환경에서 무언가를 디버깅해야 하지만 이를 사용하는 사용자에게 영향을 주고 싶지 않은 경우도 있습니다.
- . . . .
set_error_handler의 사용법은 다음과 같습니다.
<span>string</span> set_error_handler ( callback error_handler [, <span>int</span> error_types])
이제 사용자 정의 오류 처리를 사용하여 실제 경로를 필터링합니다. 방문자가 관리자인지 여부를 결정하는 데 사용하는 변수 $admin이 있다고 가정합니다(이 결정은 IP 또는 로그인한 사용자 ID로 이루어질 수 있음)
<span>//</span><span>admin为管理员的身份判定,true为管理员。 </span><span>//</span><span>自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。</span><span>function my_error_handler($errno,$errstr,$errfile,$errline) { </span><span>//</span><span>如果不是管理员就过滤实际路径 </span><span>if</span>(!<span>admin) { $errfile</span>=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); } </span><span>switch</span><span>($errno) { </span><span>case</span><span> E_ERROR: echo </span><span>"</span><span>ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; echo </span><span>"</span><span>程序已经停止运行,请联系管理员。</span><span>"</span><span>; </span><span>//</span><span>遇到Error级错误时退出脚本 </span><span>break</span><span>; </span><span>case</span><span> E_WARNING: echo </span><span>"</span><span>WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: </span><span>//</span><span>不显示Notice级的错误 </span><span>break</span><span>; } } </span>
이런 식으로 오류 처리 기능을 사용자 정의했는데 이 사용자 정의 기능에 오류 처리를 어떻게 넘겨주나요?
<span>//</span><span> 应用到类 </span>set_error_handler(array(&$<span>this</span>,<span>"</span><span>appError</span><span>"</span><span>)); </span><span>//</span><span>示例的做法 </span>set_error_handler(<span>"</span><span>my_error_handler</span><span>"</span>);
아주 쉽게 보안과 디버깅 편의성의 모순을 잘 해결할 수 있습니다. 또한 웹사이트 스타일에 맞게 오류 메시지를 더욱 아름답게 만드는 방법도 생각할 수 있습니다.
원저자가 주의가 필요한 두 가지 사항을 게시하겠습니다.
- E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR , E_COMPILE_WARNING은 이 핸들에 의해 처리되지 않습니다. 즉, 가장 원래의 방식으로 표시됩니다. 그러나 이러한 오류는 컴파일 또는 PHP 커널 오류로 인해 발생하며 일반적인 상황에서는 발생하지 않습니다.
- set_error_handler()를 사용한 후에는 error_reporting()이 유효하지 않게 됩니다. 즉, 위에 언급된 오류를 제외한 모든 오류는 처리를 위해 사용자 정의 함수로 전달됩니다.
<span>//</span><span>先定义一个函数,也可以定义在其他的文件中,再用require()调用 </span><span>function myErrorHandler($errno, $errstr, $errfile, $errline) { </span><span>//</span><span>为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 </span> $errfile=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); </span><span>switch</span><span> ($errno) { </span><span>case</span><span> E_USER_ERROR: echo </span><span>"</span><span><b>My ERROR</b> [$errno] $errstr<br>\n</span><span>"</span><span>; echo </span><span>"</span><span> Fatal error on line $errline in file $errfile</span><span>"</span><span>; echo </span><span>"</span><span>, PHP </span><span>"</span> . PHP_VERSION . <span>"</span><span> (</span><span>"</span> . PHP_OS . <span>"</span><span>)<br>\n</span><span>"</span><span>; echo </span><span>"</span><span>Aborting...<br>\n</span><span>"</span><span>; exit(</span><span>1</span><span>); </span><span>break</span><span>; </span><span>case</span><span> E_USER_WARNING: echo </span><span>"</span><span><b>My WARNING</b> [$errno] $errstr<br>\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>case</span><span> E_USER_NOTICE: echo </span><span>"</span><span><b>My NOTICE</b> [$errno] $errstr<br>\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: echo </span><span>"</span><span>Unknown error type: [$errno] $errstr<br>\n</span><span>"</span><span>; </span><span>break</span><span>; } </span><span>/*</span><span> Don't execute PHP internal error handler </span><span>*/</span><span>return</span><span>true</span><span>; } </span><span>//</span><span>下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 </span>$link_id=@mysql_pconnect(<span>"</span><span>localhost:3333</span><span>"</span>,<span>"</span><span>root</span><span>"</span>,<span>"</span><span>password</span><span>"</span><span>); set_error_handler(myErrorHandler); </span><span>if</span> (!<span>$link_id) { trigger_error(</span><span>"</span><span>出错了</span><span>"</span><span>, E_USER_ERROR); } </span>
좋아요, 요약하면 set_error_handler의 세 가지 사용법은 다음과 같습니다.
<span>class</span><span> CallbackClass { function CallbackFunction() { </span><span>//</span><span> refers to $this </span><span> } function StaticFunction() { </span><span>//</span><span> doesn't refer to $this </span><span> } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } </span><span>//</span><span> 三种方法如下: </span><span>1</span>: set_error_handler(<span>'</span><span>NonClassFunction</span><span>'</span>); <span>//</span><span> 直接转到一个普通的函数 NonClassFunction </span><span>2</span>: set_error_handler(array(<span>'</span><span>CallbackClass</span><span>'</span>, <span>'</span><span>StaticFunction</span><span>'</span>)); <span>//</span><span> 转到 CallbackClass 类下的静方法 StaticFunction </span><span>3</span>: $o =& <span>new</span><span> CallbackClass(); set_error_handler(array($o, </span><span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> 转到类的构造函数,其实本质上跟下面的第四条一样。 </span><span>4</span>. $o = <span>new</span><span> CallbackClass(); </span><span>//</span><span> The following may also prove useful: </span><span>class</span><span> CallbackClass { function CallbackClass() { set_error_handler(array(</span>&$<span>this</span>, <span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> the & is important </span><span> } function CallbackFunction() { </span><span>//</span><span> refers to $this </span><span> } } </span>
위 내용은 PHP set_error_handler 함수의 사용법을 관련 내용을 포함하여 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

PHP作为一种流行的Web开发语言,已经被使用了很长时间。PHP中集成的PDO(PHP数据对象)类是我们在开发Web应用程序过程中与数据库进行交互的一种常用方法。但是,一些PHP开发者经常遇到的问题是,当使用PDO类与数据库进行交互时,他们会收到这样的错误:PHPFatalerror:CalltoundefinedmethodPDO::prep

在Vue应用中使用axios是十分常见的,axios是一种基于Promise的HTTP客户端,可以用于浏览器和Node.js。在开发过程中,有时会出现“Uncaught(inpromise)Error:Requestfailedwithstatuscode500”的错误提示,对于开发者来说,这个错误提示可能有些难以理解和解决。本文将会探讨这

解决C++代码中出现的“error:incompletetypeisnotallowed”问题在C++的编程过程中,有时候会遇到一些编译错误,其中一个常见的错误是“error:incompletetypeisnotallowed”。这个错误通常是由于在使用不完整的类型进行操作时引起的。本文将介绍这个错误的原因,并提供几种解决方法。首先,我

“0271:real time clock error”开不开机的解决办法:1、按一下F1,在出现的界面中,将选项栏转到第三项“Date/Time”;2、将系统时间手动修改成现在的时间;3、按F10,在弹出的对话框中,选择yes;4、重新打开笔记本即可正常开机。

解决C++代码中出现的“error:expectedinitializerbefore'datatype'”问题在C++编程中,有时候我们在编写代码时会遇到一些编译错误,其中一种常见的错误是“error:expectedinitializerbefore'datatype'”。这个错误通常在变量声明或函数定义中发生,可能导致程序无法正确编译或

如何解决PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory在使用PHP开发过程中,我们经常会遇到一些文件操作的问题,其中之一就是"PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory

在使用PHP编写Web应用程序时,经常会使用MySQL数据库来存储数据。PHP提供了一种与MySQL数据库进行交互的方法,称为MySQLi。然而,有时在使用MySQLi时,会遇到一个错误信息,如以下所示:PHPFatalerror:Calltoundefinedfunctionmysqli_connect()这个错误信息意味着PHP无法找到my

在使用PHP进行web应用开发时,很多时候会需要使用数据库。而在使用数据库时,错误提示是非常常见的事情。其中,PHPFatalerror:Calltoamemberfunctionfetch()是一种比较常见的错误,它会在使用PDO查询数据库时出现。那么,这个错误是怎么引起的,以及如何解决呢?本文将为大家详细阐述。一、错误产生原


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Dreamweaver Mac版
시각적 웹 개발 도구
