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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.