반응형

보통 파일 업로드를 할때 체크하는게 보통 파일의 마지막 '.'위치를 찾아서 확장자를 체크하고 파일의 사이즈정도를 항상 js를 통해 체크하는수준이였는데, 이번에 파일의 위·변조 체크요청이 있어서 찾다보니 파일의 MIME TYPE을 체크하여 위변조를 체크할 수 있는 방법을 확인하였습니다.

Apache Tika를 사용하여 파일의 MIME TYPE을 체크하며, 그전에 MIME TYPE에 대해 간단하게 알아보겠습니다.

 

MIME TYPE

Multipurpose Internet Mail Extensions의 약자로 인터넷에서 파일의 성격과 형식에 따라 파일을 식별하는 방법이다.

 

브라우저의 HTTP 응답에 정의된 Content-type의 헤더값을 확인하면 extension/plugin 이다.

과거 SMTP 프로토콜을 사용하여 전송되는 이메일을 위해 작성되었다.

 

하위 유형 앞에 x-로 시작하는 경우는 표준이 아니며 등록되지 않았다는것을 의미한다.

하위 유형 앞에 vnd가 붙으면 공급업체에 따라 변경된다는것을 의미한다.(msoffice 등)

 

출처: https://www.freeformatter.com/mime-types-list.html

 

zpage.mime.types.title

MIME Types List I have compiled a full list of MIME types using the "mime.types" file of the Apache HTTPD virtual private server. I took the liberty of adding a name/description for each MIME type so that it's clearer what they represent. I have also inclu

www.freeformatter.com

 

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처리된 것을 볼 수 있습니다.

반응형