programming language/Java

보안) FileUtils를 이용한 업로드 확장자를 제한하는 방법

Lcoding 2024. 7. 23. 09:23
반응형

 

보안 관련하여 .bat나 .exe등의 실행 파일을 업로드하여 서버에서 실행되게하여 해킹 공격을 하는 경우가 있습니다.

그런 경우를 제한하기 위하여 파일 업로드 시 특정 확장자를 제한하는 방법을 사용하는데요.

예를 들어, Java에서는 Apache Commons FileUtils를 사용하여 간단하게 구현할 수 있습니다.

 

1. Apache Commons FileUtils 추가 -  

프로젝트에 Apache Commons IO 라이브러리를 추가해야 합니다.

Maven을 사용하는 경우, pom.xml 파일에 다음을 추가하세요:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version> <!-- 버전 확인 필요 -->
</dependency>

 

1_1. Gradle을 사용하는 경우, build.gradle 파일에 다음을 추가합니다 -

dependencies {
    implementation 'commons-io:commons-io:2.11.0' // 버전 확인 필요
}

 

 

2. 업로드 제한 구현 - 

업로드된 파일의 확장자를 확인하여 특정 확장자만 허용하거나 제한할 수 있습니다.

예를 들어, 확장자가 .jpg, .png, .gif인 파일만 허용하려면 다음과 같이 구현할 수 있습니다:

import org.apache.commons.io.FilenameUtils;

public class FileUploadUtil {
    private static final String[] ALLOWED_EXTENSIONS = {"jpg", "png", "gif"};

    public static boolean isAllowedExtension(String fileName) {
        String ext = FilenameUtils.getExtension(fileName).toLowerCase();
        for (String allowedExt : ALLOWED_EXTENSIONS) {
            if (allowedExt.equals(ext)) {
                return true;
            }
        }
        return false;
    }
}

 

위의 코드에서 isAllowedExtension 메서드는 업로드한 파일 이름에서 확장자를 추출한 후, 배열의 확장자 목록과 비교하여 허용 여부를 판단합니다.

 

3. 업로드 처리 시 사용 -  

파일을 실제로 업로드하는 부분에서 이 메서드를 활용하여 특정 확장자만 허용하도록 로직을 추가합니다.

예를 들어, Spring에서 파일 업로드를 처리할 때 다음과 같이 사용할 수 있습니다.

import org.springframework.web.multipart.MultipartFile;

public class FileUploadController {

    public void handleFileUpload(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        if (FileUploadUtil.isAllowedExtension(fileName)) {
            // 허용된 파일 처리 로직 추가
            // 파일 저장 및 데이터베이스에 저장 로직 구현
        } else {
            // 허용되지 않은 파일 확장자 처리 로직 추가
            // 사용자에게 오류 메시지 전송 및 오류페이지로 이동
        }
    }
}

 

이러한 방법을 통해 파일 업로드 시 특정 확장자를 제한할 수 있습니다.

Apache Commons IO를 사용하면 파일 처리와 관련된 여러 유틸리티 함수들을 간편하게 활용할 수 있어 개발 과정을 효율적으로 관리할 수 있습니다.

 

실행가능한 파일 확장자는 공격적으로 사용될 수 있어서 특정 상황을 제외하고 일반적으로 제한 하는게 좋습니다.

실행 가능한 파일 확장자는 운영 체제와 프로그래밍 언어에 따라 다를 수 있지만,

일반적으로 널리 사용되는 실행 가능한 파일 확장자 목록은 다음과 같습니다.

  1. Windows 운영 체제:
    • .exe : Windows에서 실행 가능한 프로그램 파일
    • .msi : Windows Installer 패키지
    • .bat : 배치 파일
    • .cmd : Windows 명령 프롬프트 스크립트
  2. macOS 운영 체제:
    • .app : macOS 애플리케이션
    • .dmg : macOS 디스크 이미지
    • .pkg : macOS 패키지 설치 파일
  3. Linux 및 Unix 기반 운영 체제:
    • .sh : 셸 스크립트
    • .bin : 바이너리 실행 파일
    • .run : 실행 가능한 설치 스크립트
  4. 크로스 플랫폼 (일반적으로):
    • .jar : Java 애플리케이션
    • .py : Python 스크립트 (일부 환경에서는 직접 실행 가능할 수 있음) 

 

인터프리터가 설치된 환경에서 직접 실행될 수 있는 스크립트 언어의 경우, 사용되는 확장자들은 다음과 같습니다.

  1. Python: .py
    • Python 스크립트는 일반적으로 .py 확장자를 가집니다. Python 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
  2. Perl: .pl
    • Perl 스크립트는 주로 .pl 확장자를 사용합니다. Perl 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
  3. Ruby: .rb
    • Ruby 스크립트는 보통 .rb 확장자를 가집니다. Ruby 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
  4. Shell Script (Bash 등): .sh
    • 셸 스크립트는 주로 .sh 확장자를 사용합니다. 셸 인터프리터가 설치된 Unix 또는 Linux 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.

 

 

감사합니다.

반응형