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
}
}
'개발 꿀팁 > PHP' 카테고리의 다른 글
PHP 구현 이분 검색 알고리즘 (0) | 2022.07.26 |
---|---|
PHP 액세스 MySQL 쿼리 시간 초과 처리 (0) | 2022.07.26 |
PHP 배열 필터 null 값 array_filter (0) | 2022.07.26 |
php 조작 redis의 상용 방법은 어떤 것이 있습니까?php조작레디스방법정리(코드첨부) (0) | 2022.07.26 |
php와 ajax는 어떻게 표의 실시간 편집이 가능합니까(코드 첨부) (0) | 2022.07.25 |