ประเภท MIME เป็นตัวระบุรูปแบบข้อมูลมาตรฐานที่ใช้ใน iOS เพื่อกำหนดประเภทไฟล์เมื่อส่งผ่านเครือข่าย ระบบไฟล์ และการสื่อสารระหว่างกระบวนการ ตาม เอกสารสำหรับนักพัฒนา Apple, 2024, ประเภท MIME (Multipurpose Internet Mail Extensions) จัดประเภทไฟล์ตามเนื้อหา: image/jpeg, application/pdf, text/plain iOS แปลง MIME เป็น UTI (Uniform Type Identifier) ผ่าน UTType สำหรับการจัดการไฟล์ของระบบ
ประเด็นสำคัญ
ประเภท MIME (Multipurpose Internet Mail Extensions) เป็นตัวระบุรูปแบบข้อมูลมาตรฐานที่ประกอบด้วยสองส่วน: ชนิดหลัก (type) และชนิดย่อย (subtype) คั่นด้วยเครื่องหมายทับ หมวดหมู่หลัก: text (ข้อความ), image (รูปภาพ), audio (เสียง), video (วิดีโอ), application (ข้อมูลไบนารี), multipart (ข้อความผสม)
มาตรฐาน MIME เดิมพัฒนาขึ้นสำหรับไฟล์แนบอีเมล (RFC 2046, 1996) แต่ปัจจุบันใช้ทุกที่: เซิร์ฟเวอร์ HTTP ระบุ Content-Type ของการตอบสนอง เบราว์เซอร์กำหนดวิธีจัดการไฟล์ และแอปพลิเคชันมือถือระบุว่าข้อมูลใดสามารถเปิดได้ IANA (Internet Assigned Numbers Authority) จัดทำทะเบียนประเภท MIME ที่ลงทะเบียนไว้
ตาม ทะเบียนประเภทสื่อ IANA (2024) มีประเภท MIME ทางการมากกว่า 1,800 ประเภทที่ลงทะเบียนไว้ และจำนวนจริงรวมถึงประเภทที่กำหนดเองและของผู้จำหน่ายเกิน 5,000 ประเภท iOS รองรับประเภทมาตรฐานส่วนใหญ่และมี API สำหรับทำงานกับประเภทเหล่านั้นผ่าน Uniform Type Identifiers
UTI (Uniform Type Identifier) เป็นระบบระบุชนิดเนื้อหาของ Apple ที่ใช้ภายใน iOS และ macOS ซึ่งแตกต่างจาก MIME ตรงที่ UTI รองรับลำดับชั้นการสืบทอด (เช่น public.image เป็นพาเรนต์ของ public.png และ public.jpeg) และไม่เพียงรวมรูปแบบไฟล์เท่านั้น แต่ยังรวมถึงชนิดข้อมูลนามธรรมด้วย
| ประเภท MIME | UTI | นามสกุล | คำอธิบาย |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg, .jpeg | รูปภาพ JPEG |
| application/pdf | com.adobe.pdf | เอกสาร PDF | |
| text/plain | public.plain-text | .txt | ไฟล์ข้อความ |
| application/json | public.json | .json | ข้อมูล JSON |
| video/mp4 | public.mpeg-4 | .mp4 | วิดีโอ MP4 |
การแปลง ระหว่าง MIME และ UTI ใน iOS ดำเนินการผ่านคลาส UTType (iOS 14+) ระบบจะรักษาฐานข้อมูลการจับคู่ภายในที่ครอบคลุมรูปแบบมาตรฐานส่วนใหญ่ สำหรับประเภทที่กำหนดเอง นักพัฒนาจะลงทะเบียนการจับคู่ใน Info.plist
import UniformTypeIdentifiers
let mimeType = "image/jpeg"
if let uti = UTType(mimeType: mimeType) {
print("UTI: \(uti.identifier)")
print("สอดคล้องกับรูปภาพ: \(uti.conforms(to: .image))")
print("นามสกุล: \(uti.preferredFilenameExtension ?? "")")
}
// การแปลงย้อนกลับ: UTI เป็น MIME
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME สำหรับ PDF: \(mime)")
}
ลำดับชั้น UTI ช่วยให้ตรวจสอบว่าประเภทสอดคล้องกับหมวดหมู่ใดหมวดหมู่หนึ่งหรือไม่ ตัวอย่างเช่น รูปภาพทุกประเภท (JPEG, PNG, GIF) conform(to: .image) ซึ่งสะดวกสำหรับการกรองกลุ่มและการพิจารณาว่าประเภทสามารถจัดการโดยส่วนประกอบของระบบได้หรือไม่
ความแตกต่างสำคัญ: MIME เป็นการจำแนกแบบเรียบ (ไม่มีการสืบทอด) ในขณะที่ UTI รองรับการสืบทอดหลายรายการ ตัวอย่างเช่น public.html สอดคล้องกับทั้ง public.source-code และ public.text ซึ่งให้การกำหนดเส้นทางที่ยืดหยุ่นมากขึ้นเมื่อประมวลผลไฟล์ใน iOS
สามวิธีในการระบุประเภท MIME ใน iOS: โดยนามสกุลไฟล์ (รวดเร็วแต่ไม่น่าเชื่อถือ), โดยเนื้อหาผ่าน magic bytes (น่าเชื่อถือแต่ต้องอ่านไฟล์), และโดยส่วนหัว HTTP Content-Type (เฉพาะคำขอเครือข่าย)
import UniformTypeIdentifiers
enum MIMEDetector {
// ตรวจจับโดยนามสกุล
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// ตรวจจับโดยเนื้อหา (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
}
}
การระบุโดยนามสกุล ผ่าน UTType เป็นวิธีที่เร็วที่สุด แต่ไม่น่าเชื่อถือหากนามสกุลหายไปหรือถูกปลอมแปลง ผู้โจมตีสามารถเปลี่ยนชื่อ .exe เป็น .jpg — ระบบจะระบุเป็น image/jpeg แม้ว่าไฟล์จะเป็นไฟล์ปฏิบัติการได้ สำหรับสถานการณ์สำคัญ (ความปลอดภัย ข้อมูลทางการแพทย์) ให้ใช้การตรวจสอบตามเนื้อหาเสมอ
Magic bytes คือไบต์แรกของไฟล์ ซึ่งไม่ซ้ำกันสำหรับแต่ละรูปแบบ รูปแบบส่วนใหญ่มีลายเซ็น 2–12 ไบต์ iOS ไม่มีตัวตรวจจับ MIME ในตัวตามเนื้อหา — นักพัฒนาจะต้อง implement ตารางลายเซ็นด้วยตนเอง หรือใช้ไลบรารีเช่น CocoaLumberjack หรือตัวตรวจจับแบบกำหนดเองตามฮิวริสติก
ประเภทที่กำหนดเอง จำเป็นเมื่อแอปพลิเคชันทำงานกับรูปแบบข้อมูลที่เป็นกรรมสิทธิ์ซึ่งไม่ได้ลงทะเบียนกับ IANA หรือ Apple การลงทะเบียนใน Info.plist ช่วยให้ iOS จัดการไฟล์ดังกล่าวได้อย่างถูกต้อง: เปิดจาก Files.app, แสดงไอคอน และส่งต่อไปยังแอปพลิเคชันอื่นผ่าน UIActivityViewController
<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>
ในการลงทะเบียนประเภทที่กำหนดเอง คุณต้องระบุใน Info.plist: ตัวระบุ UTI (ในรูปแบบ reverse-DNS), ความสอดคล้องกับประเภทพาเรนต์, นามสกุลไฟล์ และประเภท MIME iOS ใช้ข้อมูลนี้สำหรับการกำหนดเส้นทางไฟล์: เมื่อผู้ใช้เปิดไฟล์ .sdc ระบบจะรู้ว่าเจ้าของคือแอปพลิเคชันของคุณ
UTExportedTypeDeclarations — สำหรับประเภทที่กำหนดโดยแอปพลิเคชันของคุณ (ส่งออก) UTImportedTypeDeclarations — สำหรับประเภทที่สร้างโดยแอปพลิเคชันอื่นที่แอปของคุณสามารถทำงานด้วย (นำเข้า) Apple แนะนำให้ลงทะเบียนประเภทที่กำหนดเองทั้งหมดที่แอปพลิเคชันของคุณทำงานด้วยเพื่อการรวมระบบที่ถูกต้อง
ประเภท MIME ที่ไม่รู้จัก ก่อให้เกิดความเสี่ยงด้านความปลอดภัยสำหรับแอปพลิเคชัน iOS หากไฟล์มีประเภทที่ไม่รู้จักหรือไม่ได้รับการยืนยัน แอปพลิเคชันควรใช้ความระมัดระวัง: อย่าเปิดไฟล์โดยอัตโนมัติ แสดงคำเตือนแก่ผู้ใช้ หรือวิเคราะห์เนื้อหาก่อนการประมวลผล
ภัยคุกคามหลัก: ไฟล์ที่มีประเภท MIME ปลอมอาจมีโค้ดที่เป็นอันตรายหรือการโจมตีช่องโหว่ของตัวแยกวิเคราะห์ iOS ปกป้องระบบผ่าน Sandbox แต่แอปพลิเคชันอาจเสี่ยงหากเชื่อถือประเภท MIME โดยไม่ตรวจสอบเนื้อหา ตรวจสอบไฟล์ด้วย magic bytes เสมอหากมาจากแหล่งที่ไม่น่าเชื่อถือ
ตาม คู่มือความปลอดภัยมือถือ OWASP, 2024 แนวทางปฏิบัติต่อไปนี้ใช้สำหรับการจัดการไฟล์ประเภทที่ไม่รู้จัก: ปฏิเสธไฟล์ที่มีประเภท MIME application/octet-stream จากแหล่งที่ไม่น่าเชื่อถือ; ใช้ UTType เพื่อตรวจสอบความสอดคล้องกับหมวดหมู่ที่คาดหวัง; อย่าเปิดไฟล์ในแอปพลิเคชันภายนอกโดยไม่ได้รับการยืนยันจากผู้ใช้; บันทึกทุกกรณีของความไม่ตรงกันระหว่าง MIME และเนื้อหาจริงสำหรับการตรวจสอบความปลอดภัย
การลงทะเบียนประเภท MIME ที่กำหนดเอง ใน Info.plist ไม่เพียงแต่เกี่ยวกับฟังก์ชันการทำงาน แต่ยังรวมถึงความปลอดภัยด้วย หากแอปพลิเคชันลงทะเบียนเฉพาะประเภทของตนเองอย่างถูกต้อง ระบบจะไม่ส่งไฟล์อื่นไปยังแอปพลิเคชันโดยผิดพลาด ใช้คำนำหน้าผู้จำหน่ายเฉพาะ (application/vnd.company.app-format) แทนคำนำหน้าทั่วไป (application/x-format) เพื่อหลีกเลี่ยงความขัดแย้งกับแอปพลิเคชันอื่น
คำถามที่พบบ่อย
ประเภท MIME เป็นตัวระบุรูปแบบข้อมูลมาตรฐานที่ประกอบด้วยชนิดและชนิดย่อย (เช่น image/jpeg) ใช้โดยเซิร์ฟเวอร์ HTTP เบราว์เซอร์และแอปพลิเคชันเพื่อกำหนดวิธีจัดการไฟล์
UTI (Uniform Type Identifier) เป็นระบบของ Apple สำหรับระบุชนิดเนื้อหาที่รองรับลำดับชั้นการสืบทอด MIME เป็นมาตรฐานแบบเรียบสำหรับเครือข่าย iOS ใช้ UTType สำหรับการแปลงระหว่าง UTI และ MIME ผ่านคุณสมบัติ preferredMIMEType
สามวิธี: โดยนามสกุล ผ่าน UTType(filenameExtension:), โดยเนื้อหา ผ่าน magic bytes (ไบต์แรกของไฟล์), โดยส่วนหัว HTTP Content-Type เพื่อความปลอดภัย ให้ใช้การตรวจสอบตามเนื้อหามากกว่าเพียงแค่นามสกุล
เพิ่ม UTExportedTypeDeclarations ใน Info.plist: ระบุตัวระบุ UTI (com.company.format), นามสกุลไฟล์, ประเภท MIME และประเภทพาเรนต์ ไฟล์ที่มีนามสกุลนี้จะเชื่อมโยงกับแอปพลิเคชันของคุณโดยอัตโนมัติ
อย่าเชื่อถือ MIME ที่ไม่รู้จัก ตรวจสอบเนื้อหาด้วย magic bytes แสดงคำเตือนแก่ผู้ใช้ และอย่าเปิดไฟล์โดยอัตโนมัติ สำหรับไฟล์ประเภท application/octet-stream ให้วิเคราะห์ฮิวริสติกก่อนการประมวลผลเสมอ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม