이번에 소나큐브를 사용해서 웹 취약점 부분을 파악하다가, 파일경로와 같은 부분에서 normalize()를 이용하라는 팁을 보았다. normalize... 사용해본적이 없기에 이번기회에 정리를 해본다.
1. normalize()란?
normalize() 메서드는 파일 경로(Path)를 정리하고 단순화하는 역할을 한다. Java의 NIO (New I/O) 패키지에서 제공되는 이 기능은 경로 문자열에 포함된 불필요하거나 모호한 요소(예: ., .., 중복된 슬래시 등)를 제거해 깔끔하고 표준화된 경로를 생성한다. 쉽게 말해, 복잡한 경로를 정리해 읽기 쉽고 명확한 경로로 변환해주는 도구인 것이다.
2. normalize() 주요 역할
1. 불필요한 경로 요소 제거
: 경로 내에 있는 . (현재 디렉토리)와 같은 불필요한 요소를 제거한다.
Path path = Paths.get("C:/example/./file.txt");
System.out.println(path.normalize());
// 결과: C:/example/file.txt
2. 상위 디렉토리 참조(..) 해결
: 경로에 포함된 .. (상위 디렉토리 참조)를 처리하여 최종 경로를 간단하게 만든다.
Path path = Paths.get("C:/example/../file.txt");
System.out.println(path.normalize());
// 결과: C:/file.txt
3. 중복된 슬래시 제거
: 경로에 중복된 슬래시(// 또는 \\)가 있을 경우 이를 단일 슬래시로 정리한다.
Path path = Paths.get("C:/example//file.txt");
System.out.println(path.normalize());
// 결과: C:/example/file.txt
3. normalize()의 한계
1. 파일의 실제 존재 여부 확인 불가
: normalize()는 단순히 경로 문자열을 표준화할 뿐, 해당 경로나 파일의 존재 여부를 확인하지 않는다.
Path path = Paths.get("C:/nonexistent/../file.txt");
System.out.println(path.normalize());
// 결과: C:/file.txt (존재 여부와 무관)
2. 파일 시스템 경계 확인 불가
: 경로 정규화는 단순히 문자열을 조작하는 방식이라, 논리적으로 불가능한 경로나 파일 시스템 경계를 넘는 경로를 방지하지 못한다.
4. normalize() VS toRealPath()
normalize()
단순히 문자열을 정리해 표준화된 경로를 반환한다.
toRealPath()
실제 파일 시스템에서 경로를 확인하며, 존재하지 않는 경로를 처리하려고 하면 예외를 발생시킨다.
결론적으로 normalize()는 경로의 불필요한 요소를 정리하고 명확한 경로를 생성하는 메소드이다. 그렇지만 단순 문자열 수준에서만 동작하므로, 파일의 유무 같은건 확인하지 않는다. 안전하게 할려면 toRealPath()를 사용하는게 좋을 것 같다.
'Today I Learned > Java' 카테고리의 다른 글
[Java] META-INF 디렉토리와 MANIFEST.MF (0) | 2025.03.12 |
---|---|
[Java] try-with-resources (자원 관리 최적화) (1) | 2025.03.11 |
[Java] java ee에 관하여 (2) | 2024.12.22 |
[Java] BiFunction과 ToIntBiFunction의 차이 (2) | 2024.11.24 |
[JUnit] 테스트 관련 어노테이션 정리 #1 (2) | 2024.10.13 |