Java 는 마 수 를 통 해 업로드 파일 의 종 류 를 판단 합 니 다.

머리말
파일 업로드 기능 은 많은 사이트 에서 필수 적 인 기능 이다. 파일 형식 을 판단 하면 파일 의 업 로드 를 걸 러 낼 수 있 을 뿐만 아니 라 사용자 가 악의 적 으로 실행 가능 한 파일 과 스 크 립 트 를 업로드 하 는 것 을 방지 하고 파일 업로드 서버 를 무료 파일 저장 서버 로 사용 할 수 있다.
업로드 파일 의 경우 접미사 이름 으로 파일 의 유형 을 간단하게 판단 할 수 없습니다. 악성 공격 은 실행 가능 한 파일 의 접미사 이름 을 그림 이나 다른 형식 으로 바 꾸 어 사용자 의 실행 을 유도 할 수 있 기 때문에 업로드 파일 의 유형 을 판단 하 는 데 더욱 안전 한 방식 이 필요 합 니 다.
자바 의 클 라 스 파일 과 유사 합 니 다. 여러 종류의 파일 입 니 다. 시작 하 는 몇 개의 바이트 내용 은 모두 고정 되 어 있 습 니 다. 이 몇 개의 바이트 의 내용 에 따라 파일 의 유형 을 판단 할 수 있 습 니 다. 이 몇 개의 바이트 도 '마수' 라 고 부 릅 니 다. 예 를 들 어 클 라 스 파일 의 마 수 는 'CAFEBABE' 입 니 다.
마 수 를 통 해 파일 형식 을 판단 하 는 것 이 더 안전 한 방식 입 니 다. 예제 소스 코드 는 다음 과 같 습 니 다.
소스 코드
1. 파일 형식의 매 거 진 종 류 를 새로 만 듭 니 다.

public enum FileType {

    /** JPEG */
    JPEG("FFD8FF"),

    /** PNG */
    PNG("89504E47"),

    /** GIF */
    GIF("47494638"),

    /** TIFF */
    TIFF("49492A00"),

    /** Windows bitmap */
    BMP("424D"),

    /** CAD */
    DWG("41433130"),

    /** Adobe photoshop */
    PSD("38425053"),

    /** Rich Text Format */
    RTF("7B5C727466"),

    /** XML */
    XML("3C3F786D6C"),

    /** HTML */
    HTML("68746D6C3E"),

    /** Outlook Express */
    DBX("CFAD12FEC5FD746F "),

    /** Outlook */
    PST("2142444E"),

    /** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db */
    OLE2("0xD0CF11E0A1B11AE1"),

    /** Microsoft Word/Excel */
    XLS_DOC("D0CF11E0"),

    /** Microsoft Access */
    MDB("5374616E64617264204A"),

    /** Word Perfect */
    WPB("FF575043"),

    /** Postscript */
    EPS_PS("252150532D41646F6265"),

    /** Adobe Acrobat */
    PDF("255044462D312E"),

    /** Windows Password */
    PWL("E3828596"),

    /** ZIP Archive */
    ZIP("504B0304"),

    /** ARAR Archive */
    RAR("52617221"),

    /** WAVE */
    WAV("57415645"),

    /** AVI */
    AVI("41564920"),

    /** Real Audio */
    RAM("2E7261FD"),

    /** Real Media */
    RM("2E524D46"),

    /** Quicktime */
    MOV("6D6F6F76"),

    /** Windows Media */
    ASF("3026B2758E66CF11"),

    /** MIDI */
    MID("4D546864");

    private String value = "";

    private FileType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

2. 파일 업로드 형식 을 판단 하기 위해 파일 도구 클래스 를 새로 만 듭 니 다.
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;


public class FilUtil {

    /**        */
    public static FileType getType(String filePath) throws IOException {
        //      
        String fileHead = getFileHeader(filePath);

        if (fileHead != null && fileHead.length() > 0) {
            fileHead = fileHead.toUpperCase();
            FileType[] fileTypes = FileType.values();

            for (FileType type : fileTypes) {
                if (fileHead.startsWith(type.getValue())) {
                    return type;
                }
            }
        }

        return null;
    }

    /**       */
    private static String getFileHeader(String filePath) throws IOException {
        byte[] b = new byte[28];
        InputStream inputStream = null;

        try {
            inputStream = new FileInputStream(filePath);
            inputStream.read(b, 0, 28);
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }

        return bytesToHex(b);
    }

    /**         16      */
    public static String bytesToHex(byte[] src){  
        StringBuilder stringBuilder = new StringBuilder("");  
        if (src == null || src.length <= 0) {  
            return null;  
        }
        for (int i = 0; i < src.length; i++) {  
            int v = src[i] & 0xFF;  
            String hv = Integer.toHexString(v);  
            if (hv.length() < 2) {  
                stringBuilder.append(0);  
            }  
            stringBuilder.append(hv);  
        }  
        return stringBuilder.toString();  
    } 

}

이상, 주의해 야 할 것 은 한 종류의 파일 의 마수 가 다른 유형의 파일 마수 의 앞부분 과 같 을 수 있 으 므 로 (예 를 들 어 'D0CF11E 0' 과 'D0CF1E0A1B11AE 1') 가능 한 한 긴 마수 치 를 위 에 놓 아야 한다.이곳 의 문서 와 마 수 는 매 거 진 것 도 전면적 이지 않 지만 생각 은 이렇게 하 자.
참고 문헌 [1] 진 강현. 대형 분포 식 사이트 구조 디자인 과 실천 [M]. 베 이 징: 전자 공업 출판사. 2014.09

좋은 웹페이지 즐겨찾기