현재 위치: > 최신 기사 목록> PHP RealPath를 사용하여 파일의 실제 경로를 얻고 소프트 링크 문제를 피하는 방법은 무엇입니까?

PHP RealPath를 사용하여 파일의 실제 경로를 얻고 소프트 링크 문제를 피하는 방법은 무엇입니까?

gitbox 2025-05-29

1. RealPath () 함수 소개

PHP의 RealPath () 함수는 지정된 경로의 절대 경로를 반환하고 상징적 링크, 상대 경로 (예 :... ) 등을 구문 분석하는 데 사용됩니다.

 $realPath = realpath('/var/www/html/../index.php');
echo $realPath;

이 코드는 /var/www/index.php 의 절대 경로를 출력합니다.

2. 소프트 링크로 인한 문제

소프트 링크는 다른 파일 또는 디렉토리에 대한 참조입니다. 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 () 의 동작이 목표와 일치하지 않습니다.

3. 소프트 링크로 인한 문제를 피하는 방법

1. RealPath ()를 피하십시오.

절대 경로를 얻고 소프트 링크를 구문 분석할지 여부를 신경 쓰지 않으려면 다음 방법 조합을 사용하여 얻을 수 있습니다.

 $absolutePath = rtrim(getcwd(), '/') . '/' . ltrim($relativePath, '/');

이것은 소프트 링크를 해결하지 않아 통과하는 경로의 원래 구조를 유지합니다.

2. readLink ()를 사용하여 소프트 링크인지 확인하십시오.

경로가 소프트 링크인지를 결정하고 직접 논리를 처리 할 수 ​​있습니다.

 if (is_link($path)) {
    $target = readlink($path);
    echo "이것은 소프트 링크입니다,목표는:" . $target;
}

프로젝트 요구 사항에 따라 링크를 따라야하는지 또는 원래 경로를 유지할지 결정할 수 있습니다.

3. 경로를 수동으로 정규화합니다 (소프트 링크 해상도 없음)

다음은 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);

이것은 정리합니다 . 그리고 .. 경로에서, 그러나 소프트 링크를 해결하지는 않습니다.

4. 원래 경로와 실제 경로를 비교하십시오

권한 제어 중에 원래 경로 및 RealPath () 경로는 동시에 기록하여 권한 비교를 할 수 있습니다.

 $originalPath = '/data/app/storage/link/file.txt';
$realPath = realpath($originalPath);

if (strpos($realPath, '/data/app/storage/real/') !== 0) {
    die('이 경로는 허용되지 않습니다');
}

이 접근법은 소프트 링크가 민감한 경로를 가리키는 문제를 다루는 데 적합합니다.

4. 실제 응용 프로그램 제안

  • 디렉토리 확인 : RealPath ()를 사용하기 전에 원래 경로가 합법적인지 확인하고 해상도 후에도 허용 가능한 범위 내에 있는지 확인하십시오.

  • 개발 환경 디버깅 : 배포 환경에는 많은 소프트 링크가 있습니다. 일관되지 않은 경로로 인한 버그를 피하기 위해 디버깅 중 경로 변경에주의를 기울여야합니다.

  • 프레임 워크 개발 : 프레임 워크를 개발하는 경우 RealPath () 에 직접 의존하는 대신 사용자 정의 경로 해상도 도구를 제공하는 것이 좋습니다.

5. 요약

PHP의 RealPath () 는 소프트 링크를 처리 할 때 실제로 경로 균일 성과 단순성을 가져올 수 있지만 구문 분석 동작으로 인해 경로 연결을 유발할 수도 있습니다. 보안 및 일관성 요구 사항이 높은 응용 프로그램의 경우 실제 요구에 따라보다 세밀한 경로 처리 전략을 채택하고 RealPath () 에만 의존하지 않기 위해 필요한 경우 경로 분석 논리를 직접 구현하는 것이 좋습니다.