현재 위치: > 최신 기사 목록> IS_DIR 함수를 사용한 파일 경로 유효성 검증에 대한 모범 사례

IS_DIR 함수를 사용한 파일 경로 유효성 검증에 대한 모범 사례

gitbox 2025-05-26

1. 기본 사용법 소개

is_dir () 는 PHP의 내장 함수 중 하나이며 경로가 기존 디렉토리인지 여부를 결정하는 데 사용됩니다.

<code> $ path = '/var/www/html/uploads'; if (is_dir ($ path)) {echo "이것은 유효한 디렉토리입니다"; } else {echo "이 경로는 디렉토리가 아니거나 존재하지 않습니다"; } </code>

이 함수는 서버의 실제 파일 시스템 상태를 기반으로 부울 반환합니다.


2. 모범 사례

2.1 상대 경로 대신 절대 경로를 사용하십시오

is_dir ()를 호출 할 때 절대 경로를 사용하십시오. 현재 작업 디렉토리 (CWD)의 변경으로 인해 상대 경로가 실패 할 수 있습니다. 예를 들어:

<code> $ eLativePath = '이미지'; $ absolutepath = __dir__. '/이미지';

if (is_dir ($ absolutepath)) {
// 권장 메소드
}
</코드>

2.2 RealPath ()를 사용하여 안정성을 향상시킵니다

RealPath ()는 경로를 정규화하고 ../ 와 같은 상대 경로 구성 요소를 제거하고 소프트 링크를 식별 할 수 있습니다. IS_DIR () 와 결합하여 경로 검증을보다 효율적으로 수행 할 수 있습니다.

<code> $ path = RealPath ( '/var/www/html/uploads'); if ($ path! == false && is_dir ($ path)) {// 경로가 존재하고 디렉토리인지 확인} </code>

2.3 디렉토리 트래버스 공격 방지

사용자 입력에서 경로를 얻을 때는 디렉토리 트래버스 공격을 피하려면 ... 와 같은 위험한 문자를 필터링해야합니다. 일반 표현식 또는 화이트리스트 메커니즘과 결합 할 수 있습니다.

<code> $ input = $ _get [ 'dir'] ?? '';; if (preg_match ( '/^[a-za-z0-9 _ \-\/]+$/', $ input)) {$ path = realPath ( '/var/www/html/'. $ input); if ($ path! == false && is_dir ($ path)) {// secure access}} </code>

2.4 File_Exists ()를 사용하여 보안을 향상시킵니다

IS_DIR () 는 존재하지 않는 경로에 대해 False를 반환하지만보다 엄격한 검사 로직이 필요한 경우 먼저 File_Exists ()를 사용하여 판단을 할 수 있습니다.

<code> $ path = '/var/www/html/uploads'; if (file_exists ($ path) && is_dir ($ path)) {// 더 엄격한 확인} </code>

2.5 상징적 링크로 인한 혼란을 피하십시오

기호 링크는 is_dir ()가 예상과 다르게 행동하게 할 수 있습니다. 예를 들어, 링크가 존재하지 않는 디렉토리를 가리키면 is_dir () 도 false를 반환합니다. 다음과 함께 IS_LINK ()를 사용할 수 있습니다.

<code> $ path = '/var/www/html/uploads'; if (is_link ($ path)) {echo "이것은 기호 링크입니다"; } elseif (is_dir ($ path)) {echo "이것은 실제 디렉토리입니다"; } </code>

3. 주목할만한 것들

  • 권한 문제 : 디렉토리가 존재하더라도 PHP에 읽기 권한이없는 경우 is_dir ()가 거짓을 반환 할 수 있습니다.

  • 성능 문제 : is_dir ()로 자주 호출하여 많은 수의 경로를 확인하면 I/O 압력이 발생할 수 있으며 검증 된 경로를 캐시하는 것이 좋습니다.

  • 다중 플랫폼 호환성 : 경로 분리기는 Windows 및 Linux에서 다르며 Directory_separator를 사용하거나 / 균일하게 사용하는 것이 좋습니다.


4. 실제 예 : 업로드 디렉토리에 폴더를 안전하게 나열합니다.

<code> 함수 listuploaddirs (String $ basedir) : array {$ dir = [];
 $realBase = realpath($baseDir);
if ($realBase === false || !is_dir($realBase)) {
    return $dirs;
}

$entries = scandir($realBase);
foreach ($entries as $entry) {
    if ($entry === '.' || $entry === '..') {
        continue;
    }

    $fullPath = $realBase . DIRECTORY_SEPARATOR . $entry;
    if (is_dir($fullPath)) {
        $dirs[] = $entry;
    }
}

return $dirs;

}

$ uploaddirs = listuploaddirs ( '/var/www/gitbox.net/uploads');
print_r ($ uploaddirs);
</코드>

이 코드는 지정된 디렉토리에 모든 하위 디렉토리를 안전하게 나열하고 경로 정규화 및 기본 보안 처리를 고려합니다.