سؤال

أنا أعمل على صفحة ويب ASP الذي يعالج تحميل الملف.فقط بعض أنواع الملفات المسموح تحميلها مثل .XLS،.XML, .CSV .TXT, .PDF،.PPT،.... الخ

يجب أن تقرر ما إذا كان ملف حقا لديها نفس النوع كما يظهر تمديد.وبعبارة أخرى إذا كان trojan.exe تم تغيير اسمها إلى غير مؤذية.pdf و تحميلها على التطبيق يجب أن تكون قادرة على العثور على هذا الملف الذي تم تحميله هو لا .ملف PDF.

ما هي الأساليب التي قد تستخدم لتحليل بتحميل هذه الملفات ؟ أين يمكنني الحصول على أفضل المعلومات حول تنسيق هذه الملفات ؟

هل كانت مفيدة؟

المحلول

وطريقة واحدة سيكون للتحقق من بعض التواقيع أو الأرقام السحرية في الملفات. هذه الصفحة لديها قائمة يدوية من التوقيعات الملفات المعروفة ويبدو تماما حتى الآن:

http://www.garykessler.net/library/file_sigs.html

نصائح أخرى

وبعبارة أخرى إذا كان trojan.exe تم تغيير اسمها إلى غير مؤذية.pdf تحميل التطبيق يجب أن تكون قادرة على العثور على هذا الملف الذي تم تحميله هو لا .ملف PDF.

هذا ليس حقا مشكلة.إذا .exe تم تحميله كملف .pdf بشكل صحيح خدم إعادته إلى تنزيل التطبيق/pdf, جميع downloader سوف تحصل على أن تكون مكسورة PDF.سيكون لديهم يدويا إعادة كتابة ذلك .exe إلى الحصول على أذى.

المشاكل الحقيقية هي:

  1. بعض المتصفحات قد شم محتوى الملف وتقرر أنهم يعرفون أكثر منك حول ما هو نوع الملف.أي أمر سيء للغاية في هذه تميل إلى تفضيل تقديم الملف كملف HTML إذا كان يرى أي علامات HTML القابعة بالقرب من بداية الملف.هذا هو وبشكل خاص غير مفيد لأنه يعني السيناريو يمكن أن يكون حقن على موقع الويب الخاص بك ، يحتمل المساومة على أي تطبيق الأمان على مستوى (كوكي سرقة et al).الحلول تشمل دائما تخدم الملف كمرفق باستخدام ترتيب المحتوى و/أو خدمة الملفات من مختلف المضيف ، لذلك لا يمكن عبر موقع البرنامج النصي مرة أخرى إلى الموقع الرئيسي الخاص بك.

  2. ملفات PDF غير آمنة على أية حال!أنها يمكن أن تكون كاملة من البرمجة و كبيرة الثغرات الأمنية.استغلال ثغرة في قارئ PDF متصفح البرنامج المساعد هو حاليا واحدة من أكثر الوسائل شيوعا تثبيت حصان طروادة على شبكة الإنترنت.و لا يوجد شيء تقريبا يمكنك عادة القيام به في محاولة للكشف عن مآثر كما أنها يمكن أن تكون محل غموض.

والحصول على رؤوس الملف من أنواع الملفات "آمنة" - التنفيذية دائما أنواعها الخاصة من الرؤوس، وربما يمكنك اكتشاف تلك. عليك أن تكون على دراية بكل الأشكال التي كنت تنوي أن تقبل، ولكن.

وأنا أعلم أنك قلت C #، ولكن هذا ربما يمكن أن يكون ميناء. أيضا، كان لديه ملف XML يحتوي بالفعل العديد من واصفات لأنواع الملفات المشتركة.

وانها مكتبة جافا دعا JMimeMagic. انها هنا: http://jmimemagic.sourceforge.net/

في ** NIX * الأنظمة لدينا أداة تسمى <م> ملف (1) . محاولة للعثور على شيء مماثل لنظام التشغيل Windows، ولكن ملف فائدة إذا تم استدار النفس.

ربما يمكنك أن هذا النهج من اتجاه مختلف.بدلا من تحديد جميع أنواع الملفات التي يتم تحميلها (اكسل وحده يبدو الفوضى لي, لأنه يحتوي على العديد من الأشكال في هذه الأيام), لماذا لا تشغيل جميع الإضافات من خلال الفيروسات?مجموعة واسعة من ملفات تحتوي على فيروسات وأحصنة طروادة.قد يكون المزيد من العمل على الخادم الخاص بك, ولكن هذا هو الحل الأكثر أمانا.

ثم يعود الأمر إلى المستخدمين بشكل صحيح التعرف على أنواع الملفات التي تبدو معقولة.مضيفا في الكثير من التعليمات البرمجية (التي سوف تحتاج إلى اختبار أيضا) للتأكد فقط للمستخدمين الخاص بك يبدو وكأنه خطوة كبيرة.إذا قلت هذا .pdf2 الملف هل يمكنك إعادة تسمية .pdf ؟ إذا كان هذا هو في بيئة الشركات ثم فمن المعقول أن نتوقع المستخدمين الصحيح امتداد على الملفات الخاصة بهم.أود أن المسار الذي حملت ما وكذلك.إذا كان الجمهور ثم مسح لأنواع الملفات قد تكون جديرة بالاهتمام, ولكن كنت على الاطلاق تفعل فحص الفيروسات أيضا.

والتعليمة البرمجية التالية C ++ يمكن أن تساعدك:

//-1 : File Does not Exist or no access
//0 : not an office document
//1 : (General) MS office 2007
//2 : (General) MS office older than 2007
//3 : MS office 2003 PowerPoint presentation
//4 : MS office 2003 Excel spreadsheet
//5 : MS office applications or others 
int IsOffice2007OrOlder(wchar_t * fileName)
{
    int iRet = 0;
    byte msgFormatChk2007[8]    = {0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00};     //offset 0 for office 2007 documents
    byte possibleMSOldOffice[8] = {0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1};     //offset 0 for possible office 2003 documents

    byte msgFormatChkXLSPPT[4]  = {0xFD, 0xFF, 0xFF, 0xFF};     // offset 512: xls, ppt: FD FF FF FF 
    byte msgFormatChkOnlyPPT[4] = {0x00, 0x6E, 0x1E, 0xF0};     // offset 512: another ppt offset PPT   
    byte msgFormatChkOnlyDOC[4] = {0xEC, 0xA5, 0xC1, 0x00};     //offset 512: EC A5 C1 00 
    byte msgFormatChkOnlyXLS[8] = {0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00};     //offset 512: XLS

    int iMsgChk = 0;
    HANDLE fileHandle = CreateFile(fileName, GENERIC_READ,
        FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL  );
    if(INVALID_HANDLE_VALUE == fileHandle) 
    { 
        return -1; 
    }

    byte buff[20];
    DWORD bytesRead;
    iMsgChk = 1;
    if(0 == ReadFile(fileHandle, buff, 8, &bytesRead, NULL )) 
    { 
        return -1; 
    }

    if(buff[0] == msgFormatChk2007[0]) 
    {
        while(buff[iMsgChk] == msgFormatChk2007[iMsgChk] && iMsgChk < 9)
            iMsgChk++;

        if(iMsgChk >= 8) {  
            iRet = 1; //office 2007 file format
        }
    } 
    else if(buff[0] == possibleMSOldOffice[0])
    {
        while(buff[iMsgChk] == possibleMSOldOffice[iMsgChk] && iMsgChk < 9)
            iMsgChk++;

        if(iMsgChk >= 8)
        {   
            //old office file format, check 512 offset further in order to filter out real office format
            iMsgChk = 1;
            SetFilePointer(fileHandle, 512, NULL, FILE_BEGIN);
            if(ReadFile(fileHandle, buff, 8, &bytesRead, NULL ) == 0) { return 0; }

            if(buff[0] == msgFormatChkXLSPPT[0])
            {
                while(buff[iMsgChk] == msgFormatChkXLSPPT[iMsgChk] && iMsgChk < 5)
                    iMsgChk++;

                if(iMsgChk == 4)
                    iRet = 2;
            }
            else if(buff[iMsgChk] == msgFormatChkOnlyDOC[iMsgChk])
            {
                while(buff[iMsgChk] == msgFormatChkOnlyDOC[iMsgChk] && iMsgChk < 5)
                    iMsgChk++;
                if(iMsgChk == 4)
                    iRet = 2;

            }
            else if(buff[0] == msgFormatChkOnlyPPT[0])
            {
                while(buff[iMsgChk] == msgFormatChkOnlyPPT[iMsgChk] && iMsgChk < 5)
                    iMsgChk++;

                if(iMsgChk == 4)
                    iRet = 3;
            }
            else if(buff[0] == msgFormatChkOnlyXLS[0])
            {

                while(buff[iMsgChk] == msgFormatChkOnlyXLS[iMsgChk] && iMsgChk < 9)
                    iMsgChk++;

                if(iMsgChk == 9)
                    iRet = 4;
            } 

            if(0 == iRet){
                iRet = 5;
            }
        }
    }


    CloseHandle(fileHandle);

    return iRet;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top