MIME Type — یک شناسه استاندارد شده فرمت داده است که در iOS برای تعیین نوع فایل هنگام انتقال از طریق شبکه، سیستم فایل و ارتباط بین فرآیندی استفاده میشود. به گفته Apple Developer Documentation, 2024، MIME Type (Multipurpose Internet Mail Extensions) فایلها را بر اساس محتوایشان طبقهبندی میکند: image/jpeg, application/pdf, text/plain. iOS MIME را از طریق UTType به UTI (Uniform Type Identifier) تبدیل میکند برای پردازش سیستمی فایلها.
نکات کلیدی
MIME Type (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 Media Types Registry (2024)، بیش از 1800 نوع MIME رسمی ثبت شده است و تعداد واقعی با در نظر گرفتن انواع سفارشی و فروشندهای از 5000 فراتر میرود. iOS بیشتر انواع استاندارد را پشتیبانی میکند و API برای کار با آنها از طریق Uniform Type Identifiers ارائه میدهد.
UTI (Uniform Type Identifier) — سیستم اختصاصی Apple برای شناسایی انواع محتوا است که در داخل iOS و macOS استفاده میشود. برخلاف MIME، UTI از سلسلهمراتب وراثت پشتیبانی میکند (مثلاً public.image — والد برای public.png و public.jpeg) و نه تنها فرمتهای فایل، بلکه انواع داده انتزاعی را نیز شامل میشود.
| MIME Type | 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("Conforms to image: \(uti.conforms(to: .image))")
print("Extension: \(uti.preferredFilenameExtension ?? "")")
}
// تبدیل معکوس: UTI به MIME
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME for PDF: \(mime)")
}
سلسلهمراتب UTI امکان بررسی اینکه آیا یک نوع با دسته خاصی مطابقت دارد را فراهم میکند. مثلاً همه انواع تصاویر (JPEG, PNG, GIF) conforms(to: .image). این برای فیلتر گروهی و تعیین قابلیت پردازش نوع توسط اجزای سیستم مفید است.
تفاوت مهم: MIME — یک طبقهبندی مسطح است (بدون وراثت)، در حالی که UTI از وراثت چندگانه پشتیبانی میکند. مثلاً public.html هم با public.source-code و هم با public.text مطابقت دارد. این امر مسیریابی انعطافپذیرتری را هنگام پردازش فایلها در iOS فراهم میکند.
سه روش برای تشخیص MIME Type در 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 بر اساس محتوا ارائه نمیدهد — توسعهدهنده یا جدول امضاها را خود پیادهسازی میکند یا از کتابخانههایی مانند 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 از این اطلاعات برای مسیریابی فایلها استفاده میکند: وقتی کاربر یک فایل .sdoc را باز میکند، سیستم میداند که مالک آن برنامه شماست.
UTExportedTypeDeclarations — برای انواع تعریف شده توسط برنامه شما (صادرات). UTImportedTypeDeclarations — برای انواع ایجاد شده توسط برنامههای دیگر که برنامه شما میتواند با آنها کار کند (واردات). Apple توصیه میکند همه انواع سفارشی که برنامه با آنها کار میکند را برای یکپارچهسازی صحیح با سیستم ثبت کنید.
انواع MIME ناشناخته برای امنیت برنامه iOS خطر ایجاد میکنند. اگر فایل دارای نوع ناشناخته یا تأیید نشده باشد، برنامه باید اقدامات احتیاطی انجام دهد: فایل را به طور خودکار باز نکند، به کاربر هشدار نشان دهد یا قبل از پردازش محتوا را تحلیل کند.
تهدیدهای اصلی: یک فایل با نوع MIME جعلی ممکن است حاوی کد مخرب یا بهرهبرداری از آسیبپذیری تجزیهکننده باشد. iOS از سیستم از طریق Sandbox محافظت میکند، اما برنامه ممکن است آسیبپذیر باشد اگر بدون بررسی محتوا به نوع MIME اعتماد کند. همیشه فایل را از طریق magic bytes بررسی کنید اگر از منبع غیرقابل اعتماد دریافت شده است.
به گفته OWASP Mobile Security Guide, 2024، برای پردازش فایلهای انواع ناشناخته از روشهای زیر استفاده میشود: فایلهای با نوع MIME application/octet-stream از منابع تأیید نشده را رد کنید؛ برای بررسی مطابقت با دستههای مورد انتظار از UTType استفاده کنید؛ فایلها را در برنامههای خارجی بدون تأیید کاربر باز نکنید؛ تمام موارد عدم مطابقت بین MIME و محتوای واقعی را برای حسابرسی امنیتی ثبت کنید.
ثبت انواع MIME سفارشی در Info.plist — این نه تنها قابلیت، بلکه امنیت است. اگر برنامه فقط انواع خود را به درستی ثبت کند، سیستم به اشتباه فایلهای دیگر را به آن ارسال نخواهد کرد. به جای پیشوندهای عمومی (application/x-format) از پیشوندهای خاص فروشنده (application/vnd.company.app-format) استفاده کنید تا از تداخل با برنامههای دیگر جلوگیری کنید.
سوالات متداول
MIME Type — یک شناسه استاندارد فرمت داده است که از نوع و زیرنوع تشکیل شده (مثلاً 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید