Cromo
Chrome (versione 38 al momento della scrittura) ha 3 modi per determinare il tipo MIME e lo fa in un certo ordine. Lo snippet di seguito è da file src/net/base/mime_util.cc, metodo 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.
Gli elenchi hard-coded sono un po 'prima nel file: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappingsekSecondaryMappings ).
Un esempio: quando si carica un file CSV da un sistema Windows con Microsoft Excel installato, Chrome lo segnalerà come application/vnd.ms-excel. Questo perché .csvnon è specificato nel primo elenco hardcoded, quindi il browser torna al registro di sistema. HKEY_CLASSES_ROOT\.csvha un valore denominato Content Typeche è impostato suapplication/vnd.ms-excel .
Internet Explorer
Sempre usando lo stesso esempio, il browser riporterà application/vnd.ms-excel. Penso che sia ragionevole presumere che Internet Explorer (versione 11 al momento della scrittura) utilizzi il registro. Forse fa anche uso di un elenco hard-coded come Chrome e Firefox, ma la sua natura closed source lo rende difficile da verificare.
Firefox
Come indicato nel codice Chrome, Firefox (versione 32 al momento della scrittura) funziona in modo simile. Snippet da file uriloader\exthandler\nsExternalHelperAppService.cpp, metodonsExternalHelperAppService::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
Gli elenchi hard-coded sono presenti in precedenza nel file, da qualche parte vicino alla riga 441. Stai cercando defaultMimeEntriese extraMimeEntries.
Con il mio profilo attuale, il browser segnalerà text/csvperché c'è una voce per esso inmimeTypes.rdf (elemento 2 nell'elenco sopra). Con un nuovo profilo, che non ha questa voce, il browser segnaleràapplication/vnd.ms-excel (elemento 3 nell'elenco).
Sommario
Gli elenchi hard-coded nei browser sono piuttosto limitati. Spesso il tipo MIME inviato dal browser sarà quello segnalato dal sistema operativo. Ed è proprio per questo che, come affermato nella domanda, il tipo MIME segnalato dal browser non è affidabile.