در بسیاری از موارد نیاز است که کاربر و یا مدیر سایت ، یک سری فایل بر روی سایت آپلود نماید ، حال این فایل می تواند یک تصویر  ، یک سند متنی ، یک فایل فشرده و یا یک فایل ویدئویی باشد.

در این موارد برنامه نویس حتما می بایست پسوند فایل را بررسی نماید و اجازه آپلود هر نوع فایلی را ندهد.


در asp.net برای بررسی پسوند فایل ها چندین راه وجود دارد که در اینجا یکی از این راه ها را آموزش خواهیم داد :

به کد زیر توجه کنید :


در این کد ما یک آرایه ایجاد کرده ایم و تمامی انواع فایلی (MIME TYPES) مجاز را درون آن قرار داده ایم ، سپس تمامی آرایه را درون یک متغیر از نوع StringCollection ریخته ایم و در پایان با کمک تابع Contains به راحتی پسوند فایل را بررسی نموده ایم.

این راه حلی است که همکار بنده از اون استفاده می کنه.

یکی از مشکلات کد بالا این است که شما باید MIME TYPE ها را بلد باشید و همچنین نحوه عملکرد تابع Contains در حاله ای از ابهام است و باید حتما حسابی این تابع رو چک کنید و ببینید که در مقابل همه نوع فایلی درست عمل می کنه یا نه . (البته اینو برای این گفتم که خودم تا حالا با این تابع کار نکردم و کارکردشو نمی تونم بهتون تضمین بدم)

سایت نت نیک

در ادامه راه حل دیگری که بنده خودم ازش توی کارام استفاده می کنم رو بهتون آموزش میدم:
به کد زیر توجه کنید:



بنده یک کلاس استاتیک ساخته ام و درون اون یک پراپرتی استاتیک ایجاد کرده ام.
درون متد get این پراپرتی ، یک لیست جنریک از نوع استرینگ (<List<string) تعریف کرده ام که درون آن با استفاده از تابع Add تک تک پسوند های مجاز را درونش اضافه می کنم.
دقت کنید که در اینجا ما صحبتی از MIME TYPE نزدیم و شما فقط با پسوند فایل ها سرو کار دارین.

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

در ادامه من لیست جنریکم رو return می کنم.

در این کلاس یک تابع دارم که نام یک فایل رو می گیره و بعد روی لیست جنریکم حرکت می کنه و پسوند فایل رو با تک تک خونه های داخل لیست تطابق میده و در صورتی که تطابقی پیدا شد مقدار true و در غیر اینصورت مقدار false رو برمی گردونه.


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

تا آموزشی دگر بدرود.
سوالاتتونو تو بخش نظرات و یا در انجمن سایت مطرح کنین.

------------------------------------
آپدیت :

جناب آقای رضا کیا این مطلب رو ارسال نمودند که در جهت تکمیل این آموزش اینجا قرارش میدم:

سلام

نکته اوّل:
تابع Contains رو اصلا بهش شک نکن!
این تابع تمام حالتهای ضرب دکارتی مجوعه اصلی و مجموعه قیاس رو چک میکنه

برای همین برای مجموعه های بزرگ اصلا بهینه نیست.

نکته دوّم:
روش همکارت خیلی بهتره! چون با روش خودت امکان Shell Upload رو بوجود میاری، روش خودت درست مثل این میمونه که اجازه بارگذاری هر فایلی رو بدی!! جزییاتش رو تو وب دنبال کن
با این کلید واژه Shell Upload attack

نکته سوّم:
از این دستور تک خطی به جای کل تابع میتونی استفاده بکنی
سرعت اجراش کمی «کمی فقط» بیشتر و بهتره
خوانایی هم البته بیشتر داره



اگه سوالی بود بهم ایمیل بزن
آموزش خوبی بود :)
موفق باشی و سربلند

----------------------------------------
پاسخ بنده به ایشون:
 سلام
خیلی ممنون از راهنماییت ، دستت طلا.
به مطلب خیلی مهمی اشاره کردی.
با توجه به صحبت شما میشه به این نتیجه رسید که کد بنده فقط پسوند رو چک می کنه ولی کد شما و کد همکارم داره ماهیت کامل فایل رو چک می کنه که مطمئنا روش شما و همکارم خیلی بهتر از روش بنده است و به بالاخص از جنبه امنیتی نیز بسیار مهم است.
با تشکر.

نوشته شده در تاریخ جمعه 3 خرداد 1392    | توسط: ح.م    | طبقه بندی: آموزش ASP.NET، آموزش امنیت در asp.net،     | نظرات()