보통 파일 업로드를 할때 체크하는게 보통 파일의 마지막 '.'위치를 찾아서 확장자를 체크하고 파일의 사이즈정도를 항상 js를 통해 체크하는수준이였는데, 이번에 파일의 위·변조 체크요청이 있어서 찾다보니 파일의 MIME TYPE
을 체크하여 위변조를 체크할 수 있는 방법을 확인하였습니다.
Apache Tika
를 사용하여 파일의 MIME TYPE
을 체크하며, 그전에 MIME TYP
E에 대해 간단하게 알아보겠습니다.
MIME TYPE
Multipurpose Internet Mail Extensions
의 약자로 인터넷에서 파일의 성격과 형식에 따라 파일을 식별하는 방법이다.
브라우저의 HTTP
응답에 정의된 Content-type
의 헤더값을 확인하면 extension/plugin
이다.
과거 SMTP 프로토콜
을 사용하여 전송되는 이메일을 위해 작성되었다.
하위 유형 앞에 x-로 시작하는 경우는 표준이 아니며 등록되지 않았다는것을 의미한다.
하위 유형 앞에 vnd가 붙으면 공급업체에 따라 변경된다는것을 의미한다.(msoffice 등)
출처: https://www.freeformatter.com/mime-types-list.html
MIME TYPE
은 이정도로 간단하게 알아보고 Tika
를 사용하여 MIME TYPE
을 알아보겠습니다.
Tika
pom.xml
<!-- Tika -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.14</version>
</dependency>
dependency에 추가를 해줍니다.
(테스트 대상이 될 이미지 3개) 해당 파일들을 경로별로 체크해보겠습니다.
App.java
import java.io.File;
import java.io.IOException;
import org.apache.tika.Tika;
public class App{
public static void main( String[] args ){
File file1 = new File("C:/test/ggome.jpg");
File file2 = new File("C:/test/kor.gif");
File file3 = new File("C:/test/box.png");
try {
System.out.println(checkImageMimeType(file1));
System.out.println(checkImageMimeType(file2));
System.out.println(checkImageMimeType(file3));
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean checkImageMimeType(File file) throws IOException{
Tika tika = new Tika();
String mimeType = tika.detect(file);
System.out.println(mimeType);
if(mimeType.startsWith("image")) {
return true;
}else {
return false;
}
}
}
각각 파일들을 detect
메소드를 통해 처리해보니 각각 파일의 종류와 확장자를 sysout을 통해 찍어주는 것을 볼 수 있습니다.
위변조 체크해보기
자 그럼 위변조가 목적이었으니 애초에 텍스트였던 파일을 강제로 확장자를 변경해서 체크해보겠습니다.
이런식으로 텍스트 파일을 만들고 확장자를 변경합니다.
소스를 통해 확인해보겠습니다.
import java.io.File;
import java.io.IOException;
import org.apache.tika.Tika;
public class App{
public static void main( String[] args ){
File file1 = new File("C:/test/test.jpg");
try {
System.out.println(checkImageMimeType(file1));
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean checkImageMimeType(File file) throws IOException{
Tika tika = new Tika();
String mimeType = tika.detect(file);
System.out.println(mimeType);
if(mimeType.startsWith("image")) {
return true;
}else {
return false;
}
}
}
확장자는 jpg이지만 텍스트 타입이라고 나오고 이미지타입이 아니기때문에 false처리된 것을 볼 수 있습니다.
'WEB > Spring' 카테고리의 다른 글
Spring - 스프링에서 NettyServer 동작 후 종료시 바인딩 현상 (0) | 2020.11.25 |
---|---|
Spring - 스프링 프로젝트에서 netty사용하기 (7) | 2020.09.22 |
Spring - multipart전송인 경우 AOP에서 파라미터 가져오기 (0) | 2020.04.27 |
Spring - java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList (0) | 2020.04.23 |
Spring - Filter에서 @PostConstruct 처리시 2번 이상 동작하는 현상 (0) | 2020.04.14 |