개발 꿀팁/PHP

phpset_error_handler() 중요 사용법

Jammie 2022. 7. 26. 16:37
반응형

set_error_handler라는 함수의 역할은 잘못된 경로 유출을 방지하기 위한 것이다



무엇이 잘못된 경로로 유출되었는가?

우리가 프로그램을 쓰면 문제가 생길 수밖에 없고 (항상 문제가 생길 수 있다:razz:) PHP는 우연히 만난다.오류가 발생했을 때 오류 스크립트의 비트를 제공합니다배치, 행수 및 원인

그리 대단한 것은 아니라고 말하는 사람이 많다.확실히 프로그램 디버깅 단계에서는 확실히 별거 아닙니다.그리고 나는 잘못된 경로를 주는 것이 필요하다고 생각한다.

그러나 실제 경로를 누설한 결과는 상상조차 할 수 없는 것으로, 어떤 침입자에게 이 정보는 매우 중요하다.사실 지금 많은 서버가이 문제가 존재한다.



일부 네트워크 관리자는 PHP 프로필의 Display_errors를 Off로 설정합니다해결 (이렇게 하는 것 같아)하지만 너무 소극적이라는 게 본인의 생각이다.



때때로 우리는 PHP가 잘못된 정보를 반환하여 디버깅을 할 필요가 있다.그리고 틀렸을 때 필요할 수도 있어요고객을 응대해야 하고, 심지어 다른 곳으로 안내해야 한다.한 페이지.



그렇다면 어떤 해결책이 있을까.

PHP는 4.1.0부터 사용자 정의 오류 처리 핸들을 제공하는 기능 함수 set_error_핸들러(), 그러나 매우 적다.수각본 작성자는 안다.





set_error_handler의 사용법은 다음과 같다

Php코드 컬렉션 코드
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");

so easy, 그러면 보안과 편리한 디버깅의 모순을 잘 해결할 수 있을 거야.또 잘못된 힌트를 웹사이트 스타일에 맞게 보기 좋게 만드는 데도 신경을 쓸 수 있다.

1.E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING은 이 핸들에 의해 처리되지 않습니다. 즉 가장 원시적인 방식으로 표시됩니다.그러나 이 같은 오류는 모두 번역이나 PHP 커널 오류로 통상적으로 발생하지 않는다.
2.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의 세 가지 용법입니다

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항과 같다。  
  
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  
   }  
}
반응형