PHP에서 get_defined_constants ()는 모든 정의 된 상수 (사용자 정의 및 PHP 시스템 미리 정의 된 상수 포함) 및 해당 값을 가져 오는 함수입니다. 이 기능은 디버깅, 구성 검사 또는 디버깅 도구를 개발할 때 매우 유용하지만 부적절하게 사용하면 특히 민감한 정보와 관련된 시나리오에서 보안 위험이 발생할 수 있습니다.
get_defined_constants ([bool $ categorize = false]) : 배열
이 함수는 현재 스크립트에서 정의 된 모든 상수를 반환합니다. 매개 변수 $ categorize가 true 로 설정되면 반환 된 배열은 다양한 상수의 소스를 식별하기 위해 모듈별로 분류됩니다.
예를 들어:
$constants = get_defined_constants();
print_r($constants);
이 코드는 e_error , php_version 과 같은 상수 및 Define () 또는 const 를 통해 사용자가 정의한 상수를 포함하여 정의 된 모든 상수 및 해당 값을 출력합니다.
대부분의 시스템 예측 상수는 무해하지만 사용자 정의 상수는 데이터베이스 자격 증명, API 키, 경로 정보 등과 같은 민감한 정보를 포함 할 수 있습니다.
define('DB_PASSWORD', 'SuperSecretPassword123');
define('API_KEY', 'sk_live_abc123xyz789');
get_defined_constants () 의 반환 결과가 디버깅 도구 또는 로깅 시스템에서 직접 출력하여 외부 사용자에게 노출되면 민감한 정보가 유출 될 수 있습니다. 이는 다중 사용자 환경 또는 디버깅 도구에서 온라인 환경을 배포 할 때 특히 위험합니다.
특히 일부 디버그 페이지 또는 오류 처리 시스템에서 개발자는 다음과 같은 문제를 분석하기 위해 글로벌 주를 습관적으로 출력 할 수 있습니다.
echo '<pre>';
print_r(get_defined_constants());
echo '</pre>';
이러한 출력이 권한에 의해 제한되지 않으면 공격자는 페이지에 액세스하여 민감한 데이터를 포함하는 일정한 컨텐츠를 얻을 수 있습니다.
PHP 디버깅 도구 (예 : 사용자 정의 오류 모니터)가 https://debug.m66.net/debug.php 에 배포되어 다음 코드를 포함한다고 가정합니다.
if ($_GET['debug'] === '1') {
echo '<pre>';
print_r(get_defined_constants());
echo '</pre>';
}
디버그 스위치가 활성화되면 페이지는 모든 일정한 정보를 출력합니다. 일부 상수가 다음을 포함하는 경우.
define('PAYMENT_GATEWAY_SECRET', 'sk_test_abc123');
define('AWS_SECRET_ACCESS_KEY', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');
공격자는이 정보를 쉽게 읽을 수있어 심각한 보안 결과를 초래할 수 있습니다.
민감한 정보 유출을 방지하려면 get_defined_constants ()를 사용할 때 다음 모범 사례를 따르는 것이 좋습니다.
생산 환경에서 모든 상수를 출력하지 마십시오 . 이 기능은 로컬 또는 신뢰할 수있는 개발 환경에서만 사용하십시오.
민감한 정보의 분류 관리 . 민감한 구성을 별도의 구성 파일에 배치하고 파일이 상수로 정의되지 않았지만 메모리에 변수로 저장되어 있는지 확인하십시오.
액세스 제어 . 디버깅 정보가 포함 된 모든 인터페이스는 인증되어야하며 공개 액세스는 금지되어야합니다.
조건부 필터 출력 . 예를 들어 비밀 , 키 , 암호 등과 같은 민감한 키워드를 포함하는 상수를 제외하고 출력 전에 상수 이름을 확인하십시오.
$constants = get_defined_constants();
foreach ($constants as $name => $value) {
if (preg_match('/(SECRET|KEY|PASSWORD)/i', $name)) {
continue;
}
echo "$name => $value\n";
}
로그 소실화 . 일정한 정보가 로그 시스템에 기록 된 경우 작성하기 전에 탈감작을 수행하십시오.
get_defined_constants () 는 강력한 기능이지만 "능력이 클수록 책임이 커집니다." 개발자는 특히 민감한 정보와 관련된 상황에서 잠재적 인 보안 위험을 완전히 고려해야합니다. 우수한 액세스 제어, 출력 필터링 및 환경 격리를 통해이 기능을 사용하여 발생하는 위험을 효과적으로 줄이고 응용 프로그램의 전반적인 보안이 보장 될 수 있습니다.