보안 관련하여 .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를 사용하면 파일 처리와 관련된 여러 유틸리티 함수들을 간편하게 활용할 수 있어 개발 과정을 효율적으로 관리할 수 있습니다.
실행가능한 파일 확장자는 공격적으로 사용될 수 있어서 특정 상황을 제외하고 일반적으로 제한 하는게 좋습니다.
실행 가능한 파일 확장자는 운영 체제와 프로그래밍 언어에 따라 다를 수 있지만,
일반적으로 널리 사용되는 실행 가능한 파일 확장자 목록은 다음과 같습니다.
- Windows 운영 체제:
- .exe : Windows에서 실행 가능한 프로그램 파일
- .msi : Windows Installer 패키지
- .bat : 배치 파일
- .cmd : Windows 명령 프롬프트 스크립트
- macOS 운영 체제:
- .app : macOS 애플리케이션
- .dmg : macOS 디스크 이미지
- .pkg : macOS 패키지 설치 파일
- Linux 및 Unix 기반 운영 체제:
- .sh : 셸 스크립트
- .bin : 바이너리 실행 파일
- .run : 실행 가능한 설치 스크립트
- 크로스 플랫폼 (일반적으로):
- .jar : Java 애플리케이션
- .py : Python 스크립트 (일부 환경에서는 직접 실행 가능할 수 있음)
인터프리터가 설치된 환경에서 직접 실행될 수 있는 스크립트 언어의 경우, 사용되는 확장자들은 다음과 같습니다.
- Python: .py
- Python 스크립트는 일반적으로 .py 확장자를 가집니다. Python 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
- Perl: .pl
- Perl 스크립트는 주로 .pl 확장자를 사용합니다. Perl 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
- Ruby: .rb
- Ruby 스크립트는 보통 .rb 확장자를 가집니다. Ruby 인터프리터가 설치된 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
- Shell Script (Bash 등): .sh
- 셸 스크립트는 주로 .sh 확장자를 사용합니다. 셸 인터프리터가 설치된 Unix 또는 Linux 환경에서 이 확장자를 가진 스크립트 파일을 실행할 수 있습니다.
감사합니다.
'programming language > Java' 카테고리의 다른 글
Java _ 데이터를 엑셀 파일로 만들기 (2) | 2024.11.19 |
---|---|
Java_ 엑셀 파일 시트별로 병합하기 (2) | 2024.11.18 |
HTMLTagFilterRequestWrapper를 이용한 HTMLTagFilter 적용하기 (0) | 2024.07.19 |
람다문이란? (0) | 2024.01.27 |
인터페이스와 추상클래스의 차이점은?? (1) | 2023.12.05 |