인스타뀨램 프로젝트 진행 시 파일 확장자 검사를 진행 했지만?
확장자에 맞지 않는 파일을 강제로 변형해서 테스트를 해보면 문제없이 들어가는 문제가 있었다. 이걸 어떻게 해결할가?
링크 1
유효한 확장명을 가진 파일의 유효성을 검사하는 방법은 무엇인가요?
자바 코드에 대한 입력이 jpeg 파일이라고 가정했을 때, 들어온 값이 유효한 확장자를 가지고 있는지 해당 프로세스를 진행하기 전에 어떻게 확인할 수 있을까요?
때때로 사용자는 확장자를 jpeg로 수정한 pdf파일을 업로드해서 코드를 손상시키기도 합니다.
각 파일에는 매직넘버의 포인트가 있습니다 이 문제를 해결할 다른 대안이 있는걸까요?
답변 1 - 파일 이름만 확인하려면 다음과 같은 코드로 해결할 수 있습니다.
public boolean checkJPEG(File file) { String fileName = file.getName().toUpperCase(); return fileName.endsWith(".JPG") || fileName.endsWith(".JPEG"); } 그러나 이 방법은 내용이 아닌 파일 이름만 확인합니다. 더 완전한 방법은 매직 넘버 테스트를 포함합니다. public boolean checkJPEG(File file) throws IOException { String fileName = file.getName().toUpperCase(); boolean extension = fileName.endsWith(".JPG") || fileName.endsWith(".JPEG"); if (!extension) { return false; } FileInputStream in = null; try { in = new FileInputStream(file) byte[] magic = new byte[3]; int count = in.read(magic); if (count < 3) return false; return magic[0] == 0xFF && magic[1] == 0xD8 && magic[2] == 0xFF; } finally { try { if (in != null) in.close(); } catch (IOException ex) {} } }
파일 서명 목록
Byte[] 에서 MimeType을 추출하는 방법
- MIME 이란?
- Multipurpose Internet Mail Extensions의 약자로 간략히 파일 변환을 뜻합니다.
- 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달하기 위해 개발 되었기 때문에 이름이 internet Mail Extension입니다.
- 하지만 현재는 웹을 통해서 여러형태의 파일 전달하는데 쓰이고 있습니다.
- MIME 을 왜 사용하나요?
- MIME을 사용하기 전에는 UUEncode 방식을 이용하고 있었으며, UUEncode에는 치명적인 단점이 존재했는데 그러한 단점을 보강하여 새로운 인코딩 방식이 등장하게 되었으며 이것을 MIME이라고 합니다.
- 예전에는 텍스트파일을 주고받는데 ASCII로 공통된 표준에 따르기만하면 문제가 없었습니다. 하지만 네트워크를 통해 ASCII 파일이 아닌 바이너리 파일을 보내는 경우가 생기게 되었습니다.
- 이러한 바이너리파일에는 음악파일, 무비파일, 워드파일 등등의 문서를 지칭합니다.
- 하지만 ASCII 만으로는 전송이 불가능하여 이러한 바이너리 파일들을 기존의 시스템이서 문제없이 전달하기 위해서는 텍스트 파일로 변환이 필요하게 되었습니다.
- 이러한 텍스트 파일로 변환하는 것을 인코딩이라 하고 텍스트 파일을 바이너리 파일로 변환하는 과정을 디코딩 이라고 합니다.
- MIME으로 인한 인코딩 한 파일은 content-type 정보를 파일의 앞 부분에 담게 되며 content-type은 여러가지 타입의 있습니다.
- 특정 Content-type은 파일을 웹 서버로부터 전달받아 웹브라우저에서 열 수 있습니다.
- 웹브라우저에서 서버에 접속하여 html 문서를 요청하면서 html 문서에 있는 이미지 파일의 경로를 불러올 수 있습니다.
- 이러한 과정에서 이미지의 경로에 있는 파일이 웹브라우저에서 지원되는 MIME Type이라면 웹브라우저를 이용하여 열어볼 수 있습니다.
- 또한 파이너리 파일도 마찬가지 입니다. 주로 쓰고 있는 대부분의 포맷인 .gif, .jpg. mov등등의 파일들은 웹브라우저에서 무리 없게 열리게 되는데 브라우저에서 지원하지 못하는 유형은 따로 지정해야 합니다.
Content-Type이란?
- 우리가 클라이언트 브라우저로 어떤 자원을 보낼 때(어떤 형태의 파일이나 문서 등), 웹 서버는 일련의 HTTP 헤더로 파일이나 자원을 포함하는 바이트 Stream을 앞에 보냅니다.
- 이런 헤더는 클라이언트에게 웹 서버와 커뮤니케이션 세부사항을 묘사합니다. 예를들어, 헤더는 사용되고 있는 웹 서버의 소프트웨어의 타입, 서버의 날짜와 시간, HTTP 프로토콜, 사용중인 커넥션 타입등을 지정합니다.
- 헤더는 또한 클라이언트가 이런 가상 패스나 도메인에 대해서 저장해야 할 쿠키를 포함합니다.
링크2
- 파일 업로드는 많은 애플리케이션에서 필수적인 부분입니다.
- 아래에는 애플리케이션에 파일 업로드를 도입할 때 확인해야 할 가장 중요한 몇가지 사항을 나열하고 정리했습니다.
- 이것을 신뢰할 수 있는지 어떻게 압니까?
- OWASP 파일 업로드 차트 시트로 공식 소스에서 정보를 얻었습니다.
- 또한 Java로 작업하는 경우 이러한 원칙을 쉽게 구현할 수 있는 방법에 대한 예를 제시했습니다.