파일 업로드 시 허용된 파일 확장자 이외에는 업로드를 막는 경우가 있다.
여러가지 방법이 있겠지만 우선 제일 간단한것은 파일이름에서 확장자만 잘라서 검사를 하는 방법이 있다.
#1
private boolean isPermissionFileExt( String fileName ) throws Exception {
final String[] PERMISSION_FILE_EXT_ARR = {"GIF", "JPEG", "JPG", "PNG", "BMP", "PDF", "MP4"};
if( !StringUtils.hasText(fileName) ) {
return false;
}
String[] fileNameArr = fileName.split("\\.");
if( fileNameArr.length == 0 ) {
return false;
}
String ext = fileNameArr[fileNameArr.length - 1].toUpperCase();
boolean isPermissionFileExt = false;
for( int i = 0; i < PERMISSION_FILE_EXT_ARR.length; i++ ) {
if( PERMISSION_FILE_EXT_ARR[i].equals(ext) ) {
isPermissionFileExt = true;
break;
}
}
return isPermissionFileExt;
}
하지만 이 방법은 확장자를 제거하고 올리거나 파일 확장자를 임의로 변경하여 올릴경우 알 수가 없다는 것이다.
#2
Tika 라이브러리를 이용하여 MIME-Type을 체크할 수 있다.
MIME-Type이 무엇인지는 나중에 공부를 하여 올리도록 하겠다.
Apache Tika는 파일의 메타 데이터와 텍스트 등을 탐지하고 추출하는데 사용되는 라이브러리다.
우선은 pom.xml에 tika를 추가하도록 하겠다.
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.18</version>
</dependency>
그리고 이제 코드를 작성하겠다.
private boolean isPermisionFileMimeType( String filePath ) throws Exception {
final String[] PERMISSION_FILE_MIME_TYPE = {"image/gif", "image/jpeg", "image/png", "image/bmp", "application/pdf", "video/mp4"};
if( !StringUtils.hasText(filePath) ) {
return false;
}
File file = new File(filePath);
if( !file.isFile() ) {
return false;
}
String mimeType = new Tika().detect(file);
boolean isPermisionFileMimeType = false;
for( int i = 0; i < PERMISSION_FILE_MIME_TYPE.length; i++ ) {
if( PERMISSION_FILE_MIME_TYPE[i].equals(mimeType) ) {
isPermisionFileMimeType = true;
break;
}
}
return isPermisionFileMimeType;
}
확장자를 제거해보기도 하고 임의적으로 변조시켜 파일을 올렸을때 정상적으로 코드가 실행되는것을 확인하였다.
해당 라이브러리는 테스트 시 Java 1.7 이상에서 돌아가는듯 하였다.
1.6에서 테스트시에는 에러가 발생하였다.
다른 방법을 알게 된다면 또 기록하도록 하겠다.
[Spring/오류] Cannot change version of project facet Dynamic Web Module to 2.5. (0) | 2020.07.31 |
---|---|
[Spring/POI] SXSSF 방식을 활용한 엑셀 다운로드 (0) | 2020.07.28 |
[Spring]IE HWP 파일 다운로드 시 브라우저로 읽는 문제점, 여러가지 해결을 시도해보았습니다. (4) | 2020.05.04 |
[Spring/Java] POI 라이브러리를 활용 Excel 데이터 읽기 (0) | 2020.04.19 |
[Spring] Client Ip 가져오기 (0) | 2020.04.06 |
댓글 영역