상세 컨텐츠

본문 제목

[Java] 파일 확장자 체크(확장자 체크/Tika를 이용한 MimeType 검사)

Development/Spring

by J-Developer 2020. 4. 5. 19:10

본문

반응형

파일 업로드 시 허용된 파일 확장자 이외에는 업로드를 막는 경우가 있다.

여러가지 방법이 있겠지만 우선 제일 간단한것은 파일이름에서 확장자만 잘라서 검사를 하는 방법이 있다.

 

#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에서 테스트시에는 에러가 발생하였다.

 

다른 방법을 알게 된다면 또 기록하도록 하겠다.

반응형

관련글 더보기

댓글 영역