본문 바로가기
programming language/Java

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

by Lcoding 2024. 7. 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 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.

 

 

감사합니다.

반응형

# 로딩 화면 동작 코드(Code) 설정하기
loading