اعتبار سنجی صحت فایل قبل از آپلود در Asp.Net

در این مقاله میخواهیم قبل از آپلود فایل تشخیص دهیم که فایل وارد شده معتبر می باشد

اعتبار سنجی  صحت فایل قبل از آپلود در Asp.Net

در این مقاله میخواهیم قبل از آپلود فایل تشخیص دهیم که فایل وارد شده معتبر می باشد(MIME Types)

در اکثر پروژه ها ما از قابلیت آپلود فایل توسط کاربران برای پروژه های خود استفاده میکنیم مثل تصاویر ، فایل PDF و فایل Word و غیره  و پس از آپلود فایل را در پایگاه داده خود ذخیره میکنیم  که معمولا برای درست وارد شدن فایل پسوند آنرا چک میکنیم که فایل به  درستی انتخاب شود مشکلی که در این حالت پدیدار میشود و باعث حمله های هکرها یا ضربه زدن به سایت میشوند را در قالب یک مثال توضیح میدهم فرض کنید که پروژه شما فایل PDF را برای آپلود در نظر گرفته است حال اگر کاربر برنامه NotePad  را باز کند و یک متنی بنویسد مثل:

سپس آنرا با پسوند pdf ذخیره کنید:

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

ابتدا یک پروژه جدید از نوع وب فرم بسازید :

سپس از پنجره Solution Explorer روی نام پروژه کلیک راست کرده ویک صفحه جدید به نام Default.aspx پروژه خود اضافه کنید در این صفحه از جعبه ابزار یک کنترل فایل آپلود و یک دکمه اضافه کنید:

        <asp:FileUpload ID="FileUpload1" runat="server" />

        <asp:Button ID="Button1" runat="server" Text="آپلود"
            OnClick="Button1_Click" />

در این مثال نیاز به فضای نام زیر داریم:

using System.Runtime.InteropServices; 

سپس از طریق کد زیر در صفحه Default.aspx.cs کتابخانه urlmon.dll را به پروژه خود اضافه میکنیم:

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]  
private extern static System.UInt32 FindMimeFromData(System.UInt32 pBC,  
[MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,  
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,   
System.UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,  
System.UInt32 dwMimeFlags,  
out System.UInt32 ppwzMimeOut,  
System.UInt32 dwReserverd);

حال در رویداد کلک دکمه آپلود کد زیر را بنویسید:


    protected void Button1_Click(object sender, EventArgs e)  
        {  
      
            HttpPostedFile file = FileUpload1.PostedFile;  
            byte[] document = new byte[file.ContentLength];  
            file.InputStream.Read(document, 0, file.ContentLength);  
            System.UInt32 mimetype;  
            FindMimeFromData(0, null, document, 256, null, 0, out mimetype, 0);  
            System.IntPtr mimeTypePtr = new IntPtr(mimetype);  
            string mime = Marshal.PtrToStringUni(mimeTypePtr);  
            Marshal.FreeCoTaskMem(mimeTypePtr);  
      
            if (mime == "application/pdf")  
            {  
                // upload the File because file is valid  
                Response.Write("This is Valid File");  
            }  
            else  
            {  
                //  file is Invalid  
                Response.Write("This is Invalid File");  
                 
            }  
        }  

حال میتونید برنامه رو اجرا کنید:

سپس فایل pdf  ای که در بالا ساختیم را انتخاب میکنیم:

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

 

فایل های ضمیمه