نحوه تشخیص Mimetype یک فایل بر اساس محتوای آن در Net.


مقدمه

در این مقاله به بررسی Mimetype می پردازیم و اینکه چگونه بر اساس اطلاعات داخل فایل بتوانیم Mimetype آن را بدست آوریم. به صورت کلی در ظاهر با مشاهده پسوند یک فایل می توان mimetype آنرا بدست آورد ولی در صورتی پسوند تغییر کند نباید ماهیت فایل عوض شود برای این منظور بهتر است که با توجه به محتوای فایل، mimetype آنرا بدست آوریم.


تعریفات

در اصطلاح Mimetype متنی است که از دوبخش تشکیل می شود و ماهیت فایل در بستر اینترنت را مشخص می کند. برای مثال “image/jpeg” , ”image/gif” و ” audio/mp4” چند نمونه از متداول ترین موارد هستند. هر فایلی، Mimetype و پسوند خاص خود را دارد که بیانگر ماهیت فایل است و Mimetype با پسوند فایل رابطه مستقیم دارد. با کمک پسوند فایل می توان Mimetype آن را پیدا کرد و برعکس.

هر فایلی به صورت منطقی از سه بخش کلی تشکیل شده است.

Header, Data, Footer

 ساختار ساده یک فایل
ساختار ساده یک فایل

هدر فایل مانند یک متادیتا عمل می کند و اطلاعاتی درباره ماهیت فایل در آنجا ذخیره می شود. اغلب اطلاعات ابتدای هدر شامل مجموعه ای از اعداد است که نوع فایل با آن مشخص می شود به این اعداد ، اعداد جادویی گفته می شود(Magic Number). به کمک اعداد جادویی می توانیم ماهیت فایل را بدست بیاریم و mimetype آن را مشخص کنیم و هم چنین از طریق mimetype ، صحت پسوند فایل را تشخیص دهیم.


ساختار فایل (Bitmap) Bmp.
ساختار فایل (Bitmap) Bmp.



توجه داشته باشید که Magic Number قسمتی از هدر فایل است که به کمک آن می توان Mimetype را بدست آورد. اغلب این اعداد جادویی در ابتدای هدر قرار دارند ولی برای برخی از فایل ها این گونه نیست و با یک فاصله از ابتدا قرار می گیرند که به آن HeaderOffset می گویند.


کاربرد

یکی از کاربردهای تشخیص Mimetype برای اعتبارسنجی فایل هایی است که به سمت سرور فرستاده می شود برای مثال کاربر تصویری را به عنوان پروفایل خود انتخاب می کند و برنامه سمت سرور باید ماهیت فایل (mimetype) را به عنوان یک تصویر تشخیص دهد و از ارسال فایل هایی که ممکن است به سرور آسیب برسانند جلوگیری کند.

به عنوان مثالی دیگر در صورتی که ما برنامه ای نوشته ایم که مجموعه ای مشخصی از فایل ها ، برای نمونه فایل های تصویری را ویرایش می کند. وقتی که فایلی را کاربر برای ویرایش باز میکند؛ در اولین قدم برنامه باید تشخیص دهد که آیا این فایل محتوای تصویری دارد و توسط برنامه پشتیبانی می شود یا نه ؟!

یک نمونه فایلی که با برنامه HexEditor باز شده است
یک نمونه فایلی که با برنامه HexEditor باز شده است

در صورتی که یک فایل با ماهیت مشخص را در یکی از برنامه های به اصطلاح HexEditor با کنید می توانید محتوای آن را در قالب اعداد در مبنای شانزده مشاهده کنید و اعداد جادویی ابتدای فایل را مشاهده کنید. روشی که هکرها زیاد از آن استفاده می کنند.


کتابخانه TwentyDevs.MimetypeDetective

این کتابخانه Mimetype یک فایل را بر اساس محتوای هدر آن تشخیص می دهد. برخی از انواع فایل ها هدر یکسانی دارند و در نتیجه کار تشخیص بعد از اعداد جادویی موجود در هدر باید به کمک پسوند آنها صورت گیرد.

نحوه نصب کتابخانه

برای نصب کتابخانه کافی است دستور زیر را در کنسول وارد کنید.

Install package TwentyDevs.MimetypeDetective


نحوه استفاده از کتابخانه بدین صورت است که می توانید به تابع زیر با روشهای مختلف فایل را ارسال کنید و به عنوان خروجی شیء از نوع MimetypeInfo را دریافت کنید. در این کلاس شما می توانید کلیه اطلاعات مربوط به آن Mimetype را دریافت کنید. این اطلاعات شامل موارد زیر است.

  • پسوند
  • عنوان
  • عدد جادویی
  • و مقداری اطلاعات جزئی دیگر.

برای تشخیص mimetype یک فایل می توانید آدرس فایل ، یک استریم از فایل یا آرایه ای از بایت ها را به تابع MimetypeDetective ارسال کنید.

MimeTypeDetection.GetMimeType(filePath);

به غیر از آدرس فایل همانطور که اشاره شد ، می توانید به کمک یک استریم ، آرایه ای از بایت ها و چند override دیگر که این تابع دارد ، Mimetype را بدست آورد.

به کمک این کتابخانه حتی می توانید با استفاده از تابع زیر با ارسال پسوند فایل mimetype متناظر با آن را پیدا کنیم.

MimeTypeDetection.GetMimeTypeByExtension("rar");
//application/x-rar-compressed

همچنین با ارسال رشته Mimetype به تابع زیر می توانید سایر اطلاعات مربوط به آن را مثل پسوند متناظر و اعداد جادویی و دیگر اطلاعات را پیدا کرد.

MimeTypeDetection.GetMimeTypeinfoByMimetypeString(&quotimage/gif&quot);

در صورتی که یک نوع Mimetype جدید بخواهیم به لیست اضافه کنیم می توانیم از متد زیر استفاده کنیم.

MimeTypes.Add();

این متد یک mimetype جدید را به لیست mimetype های موجود خود اضافه می کند و شما می توانید مواردی جدید را برای مقایسه به آن اضافه کنید.

آدرس Github

برای مشاهده آدرس گیت هاب کتابخانه اینجا را کلیک کنید.

سخن آخر

تشخیص ماهیت فایل به کمک محتوای هدر آن و به اصطلاح اعداد جادویی موجود در هدر یکی از اقدامات امنیتی برای نوشتن وب سرویس های امن می باشد. در ادامه مطالب من سعی می کنم که به کمک این کتابخانه روشی را برای اعتبارسنجی فایل ارائه دهم که برای بسیار از سنارویو ها می تواند کاربردی باشد. در زیرلیست مقالاتی که در آنها از این کتابخانه استفاده شده است مشاهده می کنید.

اعتبارسنجی فایل بر اساس محتوا در Net.
اعتبارسنجی فایل بر اساس محتوا در FluentValidation


این مقاله ممکن است به مرور تکمیل تر بشود یا اصطلاحاتی در آن صورت بگیرد.