MIME Type — egy szabványosított adatformátum-azonosító, amelyet iOS-ben használnak a fájltípus meghatározására hálózaton, fájlrendszeren és folyamatok közötti kommunikáción keresztül történő átvitel során. A Apple Developer Documentation, 2024 szerint a MIME Type (Multipurpose Internet Mail Extensions) a fájlokat tartalmuk szerint osztályozza: image/jpeg, application/pdf, text/plain. Az iOS a MIME-t UTType-on keresztül UTI-vé (Uniform Type Identifier) konvertálja a fájlok rendszerszintű feldolgozásához.
Főbb pontok
MIME Type (Multipurpose Internet Mail Extensions) — egy szabványosított adatformátum-azonosító, amely két részből áll: fő típus (type) és altípus (subtype), perjellel elválasztva. Fő kategóriák: text (szöveg), image (képek), audio (hang), video (videó), application (bináris adatok), multipart (összetett üzenetek).
A MIME szabványt eredetileg e-mail mellékletekhez fejlesztették ki (RFC 2046, 1996), de ma már mindenhol használják: a HTTP szerverek a válasz Content-Type-ját jelzik, a böngészők meghatározzák a fájlok feldolgozásának módját, a mobilalkalmazások pedig — hogy milyen adatok nyithatók meg. Az IANA (Internet Assigned Numbers Authority) nyilvántartja a regisztrált MIME típusokat.
A IANA Media Types Registry (2024) szerint több mint 1800 hivatalos MIME típus van regisztrálva, és a tényleges szám az egyedi és szállítói típusokkal együtt meghaladja az 5000-et. Az iOS támogatja a legtöbb szabványos típust, és API-t biztosít a velük való munkához a Uniform Type Identifiers segítségével.
UTI (Uniform Type Identifier) — az Apple saját tartalomtípus-azonosító rendszere, amelyet iOS és macOS rendszeren belül használnak. A MIME-től eltérően az UTI támogatja az öröklődési hierarchiát (pl. public.image — szülő a public.png és public.jpeg számára), és nemcsak fájlformátumokat, hanem absztrakt adattípusokat is magában foglal.
| MIME Type | UTI | Kiterjesztés | Leírás |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg, .jpeg | JPEG kép |
| application/pdf | com.adobe.pdf | PDF dokumentum | |
| text/plain | public.plain-text | .txt | Szöveges fájl |
| application/json | public.json | .json | JSON adatok |
| video/mp4 | public.mpeg-4 | .mp4 | MP4 videó |
Konverzió MIME és UTI között iOS-ben az UTType osztályon (iOS 14+) keresztül történik. A rendszer belső megfelelési adatbázist tart fenn, amely a legtöbb szabványos formátumot lefedi. Egyedi típusokhoz a fejlesztő regisztrálja a megfelelést az Info.plist-ben.
import UniformTypeIdentifiers
let mimeType = "image/jpeg"
if let uti = UTType(mimeType: mimeType) {
print("UTI: \(uti.identifier)")
print("Conforms to image: \(uti.conforms(to: .image))")
print("Extension: \(uti.preferredFilenameExtension ?? "")")
}
// Fordított konverzió: UTI MIME-be
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME for PDF: \(mime)")
}
UTI hierarchia lehetővé teszi annak ellenőrzését, hogy egy típus megfelel-e egy adott kategóriának. Például minden képtípus (JPEG, PNG, GIF) conforms(to: .image). Ez kényelmes a csoportos szűréshez és annak meghatározásához, hogy a típust a rendszerkomponensek képesek-e feldolgozni.
Fontos különbség: MIME — lapos osztályozás (nincs öröklődés), míg az UTI támogatja a többszörös öröklődést. Például a public.html megfelel mind a public.source-code-nak, mind a public.text-nek. Ez rugalmasabb útválasztást biztosít a fájlok iOS-ben történő feldolgozásakor.
Három módszer áll rendelkezésre a MIME Type meghatározására iOS-ben: fájlkiterjesztés alapján (gyors, de megbízhatatlan), tartalom alapján magic bytes segítségével (megbízható, de a fájl olvasását igényli) és HTTP Content-Type fejléc alapján (csak hálózati kérésekhez).
import UniformTypeIdentifiers
enum MIMEDetector {
// Felderítés kiterjesztés alapján
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// Felderítés tartalom alapján (magic bytes)
static func fromFile(at url: URL) -> String? {
guard let handle = try? FileHandle(forReadingFrom: url) else {
return nil
}
defer { handle.closeFile() }
let header = handle.readData(ofLength: 12)
// PNG: 89 50 4E 47 0D 0A 1A 0A
// JPEG: FF D8 FF
// PDF: 25 50 44 46
// ZIP: 50 4B 03 04
if header.starts(with: [0x89, 0x50, 0x4E, 0x47]) {
return "image/png"
}
if header.starts(with: [0xFF, 0xD8, 0xFF]) {
return "image/jpeg"
}
if header.starts(with: [0x25, 0x50, 0x44, 0x46]) {
return "application/pdf"
}
return nil
}
}
Meghatározás kiterjesztés alapján UTType-on keresztül — a leggyorsabb módszer, de megbízhatatlan, ha a kiterjesztés hiányzik vagy hamisított. Egy támadó átnevezheti az .exe fájlt .jpg-re — a rendszer image/jpeg-ként határozza meg, pedig a fájl végrehajtható. Kritikus forgatókönyvekhez (biztonság, orvosi adatok) kötelezően használjon tartalom szerinti ellenőrzést.
Magic bytes — a fájl első bájtjai, amelyek minden formátumra egyediek. A legtöbb formátum 2–12 bájtból álló aláírással rendelkezik. Az iOS nem biztosít beépített MIME-detektort tartalom alapján — a fejlesztő vagy saját maga implementál egy aláírási táblát, vagy olyan könyvtárakat használ, mint a CocoaLumberjack, vagy egy heurisztikákon alapuló egyedi detektort.
Egyedi típusok akkor szükségesek, amikor az alkalmazás saját tulajdonú adatformátumokkal dolgozik, amelyek nincsenek regisztrálva az IANA-nál vagy az Apple-nél. Az Info.plist-ben történő regisztráció lehetővé teszi az iOS számára, hogy helyesen dolgozza fel az ilyen fájlokat: megnyissa őket a Files.app-ból, ikonokat jelenítsen meg, és továbbítsa őket más alkalmazásoknak az UIActivityViewController segítségével.
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>MyApp Document</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.myapp.secret-doc</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.myapp.secret-doc</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array><string>sdoc</string></array>
<key>public.mime-type</key>
<array><string>application/vnd.myapp.secret-doc</string></array>
</dict>
</dict>
</array>
Egy egyedi típus regisztrálásához meg kell adni az Info.plist-ben: UTI azonosítót (reverse-DNS formátumban), megfelelést a szülő típusoknak, fájlkiterjesztést és MIME típust. Az iOS ezt az információt használja a fájlok útválasztásához: amikor egy felhasználó megnyit egy .sdoc fájlt, a rendszer tudja, hogy a tulajdonosa az Ön alkalmazása.
UTExportedTypeDeclarations — az Ön alkalmazása által meghatározott típusokhoz (export). UTImportedTypeDeclarations — más alkalmazások által létrehozott típusokhoz, amelyekkel az Ön alkalmazása dolgozhat (import). Az Apple azt javasolja, hogy az alkalmazás által használt összes egyedi típust regisztrálja a rendszerrel való helyes integráció érdekében.
Ismeretlen MIME típusok kockázatot jelentenek az iOS alkalmazás biztonságára. Ha egy fájl ismeretlen vagy nem ellenőrzött típusú, az alkalmazásnak óvintézkedéseket kell tennie: ne nyissa meg automatikusan a fájlt, jelenítsen meg figyelmeztetést a felhasználónak, vagy elemezze a tartalmat a feldolgozás előtt.
Fő fenyegetések: egy hamisított MIME típusú fájl rosszindulatú kódot vagy kihasználást tartalmazhat egy elemző sebezhetőségéhez. Az iOS Sandboxon keresztül védi a rendszert, de az alkalmazás sebezhető lehet, ha a MIME típusban bízik a tartalom ellenőrzése nélkül. Mindig ellenőrizze a fájlt magic bytes segítségével, ha megbízhatatlan forrásból származik.
Az OWASP Mobile Security Guide, 2024 szerint a következő gyakorlatokat alkalmazzák ismeretlen típusú fájlok feldolgozására: utasítsa el az application/octet-stream MIME típusú fájlokat nem ellenőrzött forrásokból; használja az UTType-ot a várt kategóriáknak való megfelelés ellenőrzésére; ne nyisson meg fájlokat külső alkalmazásokban a felhasználó megerősítése nélkül; naplózza az összes eltérést a MIME és a tényleges tartalom között biztonsági audit céljából.
Egyedi MIME típusok regisztrálása az Info.plist-ben — nem csak funkcionalitás, hanem biztonság is. Ha az alkalmazás csak a saját típusait regisztrálja helyesen, a rendszer nem fog tévedésből idegen fájlokat küldeni neki. Használjon specifikus szállítói előtagokat (application/vnd.company.app-format) az általánosak (application/x-format) helyett a más alkalmazásokkal való ütközések elkerülése érdekében.
Gyakran Ismételt Kérdések
MIME Type — egy szabványos adatformátum-azonosító, amely típusból és altípusból áll (például image/jpeg). HTTP szerverek, böngészők és alkalmazások használják a fájl feldolgozási módjának meghatározására.
UTI (Uniform Type Identifier) — az Apple tartalomtípus-azonosító rendszere az öröklődési hierarchia támogatásával. MIME — lapos szabvány a hálózathoz. Az iOS az UTType-ot használja az UTI és MIME közötti konverzióhoz a preferredMIMEType tulajdonságon keresztül.
Három mód: kiterjesztés alapján UTType(filenameExtension:) segítségével, tartalom alapján magic bytes (a fájl első bájtjai) segítségével, HTTP fejléc alapján Content-Type. A biztonság érdekében használjon tartalom szerinti ellenőrzést, ne csak kiterjesztés alapján.
Adja hozzá a UTExportedTypeDeclarations elemet az Info.plist-hez: adja meg az UTI azonosítót (com.company.format), a fájlkiterjesztést, a MIME típust és a szülő típust. Az ezzel a kiterjesztéssel rendelkező fájlok automatikusan az Ön alkalmazásához lesznek társítva.
Ne bízzon ismeretlen MIME-ben. Ellenőrizze a tartalmat magic bytes segítségével, jelenítsen meg figyelmeztetést a felhasználónak, és ne nyissa meg a fájlt automatikusan. Az application/octet-stream típusú fájloknál mindig végezzen heurisztikus elemzést a feldolgozás előtt.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is