PHP의 RealPath () 함수는 지정된 경로의 절대 경로를 반환하고 상징적 링크, 상대 경로 (예 :. 및 .. ) 등을 구문 분석하는 데 사용됩니다.
$realPath = realpath('/var/www/html/../index.php');
echo $realPath;
이 코드는 /var/www/index.php 의 절대 경로를 출력합니다.
소프트 링크는 다른 파일 또는 디렉토리에 대한 참조입니다. Linux 시스템, 특히 배포 환경 (예 : Nginx 루트를 사용하여 소프트 링크 디렉토리를 가리키는 등)에서 매우 일반적입니다. 문제는 다음과 같습니다.
RealPath () 는 소프트 링크가 가리키는 실제 경로를 구문 분석하고 반환합니다.
권한 제어 또는 경로 일치를위한 경로에 의존하는 경우 RealPath () 가 반환 한 경로는 귀하의 기대치와 일치하지 않을 수 있습니다.
일부 시나리오 (예 : 화이트리스트 확인)에서 소프트 링크 해상도 후의 경로는 한계를 우회 할 수 있습니다.
예 :
다음 파일 구조가 있다고 가정합니다.
/data/app/storage/real/
/data/app/storage/link -> /data/app/storage/real/
코드는 다음과 같습니다.
$path = '/data/app/storage/link/file.txt';
echo realpath($path);
출력은 다음과 같습니다.
/data/app/storage/real/file.txt
이 시점에서 리턴 경로가 단어 링크를 포함 할 것으로 예상하면 RealPath () 의 동작이 목표와 일치하지 않습니다.
절대 경로를 얻고 소프트 링크를 구문 분석할지 여부를 신경 쓰지 않으려면 다음 방법 조합을 사용하여 얻을 수 있습니다.
$absolutePath = rtrim(getcwd(), '/') . '/' . ltrim($relativePath, '/');
이것은 소프트 링크를 해결하지 않아 통과하는 경로의 원래 구조를 유지합니다.
경로가 소프트 링크인지를 결정하고 직접 논리를 처리 할 수 있습니다.
if (is_link($path)) {
$target = readlink($path);
echo "이것은 소프트 링크입니다,목표는:" . $target;
}
프로젝트 요구 사항에 따라 링크를 따라야하는지 또는 원래 경로를 유지할지 결정할 수 있습니다.
다음은 RealPath () 에 의존하지 않는 경로 정규화 함수입니다.
function normalizePath($path) {
$parts = [];
foreach (explode('/', $path) as $segment) {
if ($segment === '' || $segment === '.') {
continue;
}
if ($segment === '..') {
array_pop($parts);
} else {
$parts[] = $segment;
}
}
return '/' . implode('/', $parts);
}
$input = '/data/app/storage/link/../link/file.txt';
echo normalizePath($input);
이것은 정리합니다 . 그리고 .. 경로에서, 그러나 소프트 링크를 해결하지는 않습니다.
권한 제어 중에 원래 경로 및 RealPath () 경로는 동시에 기록하여 권한 비교를 할 수 있습니다.
$originalPath = '/data/app/storage/link/file.txt';
$realPath = realpath($originalPath);
if (strpos($realPath, '/data/app/storage/real/') !== 0) {
die('이 경로는 허용되지 않습니다');
}
이 접근법은 소프트 링크가 민감한 경로를 가리키는 문제를 다루는 데 적합합니다.
디렉토리 확인 : RealPath ()를 사용하기 전에 원래 경로가 합법적인지 확인하고 해상도 후에도 허용 가능한 범위 내에 있는지 확인하십시오.
개발 환경 디버깅 : 배포 환경에는 많은 소프트 링크가 있습니다. 일관되지 않은 경로로 인한 버그를 피하기 위해 디버깅 중 경로 변경에주의를 기울여야합니다.
프레임 워크 개발 : 프레임 워크를 개발하는 경우 RealPath () 에 직접 의존하는 대신 사용자 정의 경로 해상도 도구를 제공하는 것이 좋습니다.
PHP의 RealPath () 는 소프트 링크를 처리 할 때 실제로 경로 균일 성과 단순성을 가져올 수 있지만 구문 분석 동작으로 인해 경로 연결을 유발할 수도 있습니다. 보안 및 일관성 요구 사항이 높은 응용 프로그램의 경우 실제 요구에 따라보다 세밀한 경로 처리 전략을 채택하고 RealPath () 에만 의존하지 않기 위해 필요한 경우 경로 분석 논리를 직접 구현하는 것이 좋습니다.