크롬
Chrome (작성 당시 버전 38) 에는 MIME 유형을 결정하는 세 가지 방법이 있으며 특정 순서로 수행합니다. 아래 스 니펫은 file src/net/base/mime_util.cc
, method 에서 가져온 것 MimeUtil::GetMimeTypeFromExtensionHelper
입니다.
// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type. That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.
하드 코딩 된 목록은 https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappings
및 kSecondaryMappings
) 파일에서 조금 더 앞서 있습니다.
예 : Microsoft Excel이 설치된 Windows 시스템에서 CSV 파일을 업로드 할 때 Chrome은이를 application/vnd.ms-excel
. 이는 .csv
첫 번째 하드 코딩 된 목록에 지정되지 않았기 때문에 브라우저가 시스템 레지스트리로 돌아갑니다. 로 설정된 HKEY_CLASSES_ROOT\.csv
값 Content Type
이 application/vnd.ms-excel
있습니다.
인터넷 익스플로러
다시 동일한 예제를 사용하면 브라우저가 application/vnd.ms-excel
. Internet Explorer (작성 당시 버전 11) 가 레지스트리를 사용 한다고 가정하는 것이 합리적이라고 생각합니다 . 아마도 Chrome 및 Firefox와 같은 하드 코딩 된 목록을 사용하지만, 폐쇄 된 소스 특성으로 인해 확인하기가 어렵습니다.
Firefox
Chrome 코드에서 알 수 있듯이 Firefox (작성 당시 버전 32) 는 비슷한 방식으로 작동합니다. 파일의 스 니펫 uriloader\exthandler\nsExternalHelperAppService.cpp
, 메소드nsExternalHelperAppService::GetTypeFromExtension
// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category
하드 코딩 된 목록은 파일의 앞부분 인 441 줄 근처에 있습니다. defaultMimeEntries
및 extraMimeEntries
.
내 현재 프로필을 사용하면 (위 목록의 항목 2)에 항목 text/csv
이 있으므로 브라우저 가보고합니다 mimeTypes.rdf
. 이 항목이없는 새 프로필을 사용하면 브라우저가보고합니다 application/vnd.ms-excel
(목록의 항목 3).
요약
브라우저의 하드 코딩 된 목록은 매우 제한적입니다. 종종 브라우저에서 보낸 MIME 유형은 OS에서보고하는 유형입니다. 이것이 바로 질문에서 언급했듯이 브라우저에서보고하는 MIME 유형이 신뢰할 수없는 이유입니다.