2009-01-16 8 views
7

पता लगाएं मैं एक एएसपी वेब पेज पर काम कर रहा हूं जो फ़ाइल अपलोड को संभालता है। केवल कुछ प्रकार की फाइलों को अपलोड करने की अनुमति है, जैसे .XLS, .XML, .CSV, .TXT, .PDF, .PPT, आदिअसली फ़ाइल प्रकार

मुझे यह तय करना होगा कि फ़ाइल में वास्तव में एक ही प्रकार है या नहीं विस्तार दिखाता है। दूसरे शब्दों में यदि trojan.exe का नाम बदलकर हानिरहित.pdf और अपलोड किया गया है, तो एप्लिकेशन यह पता लगाने में सक्षम होना चाहिए कि अपलोड की गई फ़ाइल एक .PDF फ़ाइल नहीं है।

इन अपलोड की गई फ़ाइलों का विश्लेषण करने के लिए आप किन तकनीकों का उपयोग करेंगे? इन फ़ाइलों के प्रारूप के बारे में मुझे सबसे अच्छी जानकारी कहां मिल सकती है?

उत्तर

4

फ़ाइलों में कुछ हस्ताक्षर या जादू संख्याओं की जांच करना एक तरीका होगा। इस पृष्ठ में जाना जाता है फ़ाइल हस्ताक्षर के एक आसान सूची है और काफी तारीख तक लगता है:

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

3

"सुरक्षित" फ़ाइल प्रकारों के फ़ाइल शीर्षलेख प्राप्त करें - निष्पादन योग्यों के पास हमेशा अपने स्वयं के शीर्षलेख होते हैं, और आप शायद उनको पहचान सकते हैं। हालांकि, आपको हर प्रारूप से परिचित होना होगा जिसे आप स्वीकार करना चाहते हैं।

2

मैं जानता हूँ कि आप ने कहा सी #, लेकिन यह शायद मोड़ा जा सकता है। इसके अलावा, इसमें एक एक्सएमएल फ़ाइल है जिसमें पहले से ही सामान्य फ़ाइल प्रकारों के लिए कई वर्णनकर्ता शामिल हैं।

यह जावा लाइब्रेरी है जिसे JMimeMagic कहा जाता है। यह यहां है: http://jmimemagic.sourceforge.net/

1

शायद आप इसे एक अलग दिशा से संपर्क कर सकते हैं। अपलोड किए गए सभी फ़ाइल प्रकारों की पहचान करने के बजाय (एक्सेल अकेले मुझे गड़बड़ की तरह लगता है, क्योंकि इसमें इन दिनों कई प्रारूप हैं), क्यों नहीं एक वायरस स्कैनर के माध्यम से सभी अपलोड चलाएं? विभिन्न प्रकार की फाइलों में वायरस और ट्रोजन शामिल हो सकते हैं। यह आपके सर्वर के लिए और अधिक काम हो सकता है, लेकिन यह सबसे सुरक्षित समाधान है।

फिर यह उपयोगकर्ताओं के लिए उनके फ़ाइल प्रकारों को सही ढंग से पहचानने के लिए है, जो उचित लगता है। बहुत से कोड में जोड़ना (जिसे भी परीक्षण किया जाना चाहिए) बस अपने उपयोगकर्ताओं को दोबारा जांचने के लिए एक बड़ा कदम लगता है। अगर मैं कहता हूं कि यह एक .pdf2 फ़ाइल है, तो आप इसे .pdf पर बदल देंगे? यदि यह कॉर्पोरेट वातावरण में है तो उपयोगकर्ताओं से उनकी फ़ाइलों पर सही एक्सटेंशन होने की अपेक्षा करना उचित है। मैं ट्रैक करता हूं कि किसने अपलोड किया है। यदि यह सार्वजनिक है तो फाइल प्रकारों के लिए स्कैनिंग सार्थक हो सकती है, लेकिन मैं बिल्कुल वायरस स्कैन भी करूंगा।

4

दूसरे शब्दों में यदि एक trojan.exe का नाम बदलकर हानिरहित पीडीएफ और अपलोड किया गया है, तो एप्लिकेशन यह पता लगाने में सक्षम होना चाहिए कि अपलोड की गई फ़ाइल एक पीडीएफ फ़ाइल नहीं है।

यह वास्तव में एक समस्या नहीं है। यदि एक .exe को .pdf के रूप में अपलोड किया गया था और आपने इसे डाउनलोडर को एप्लिकेशन/पीडीएफ के रूप में सही तरीके से सेवा दी है, तो सभी डाउनलोडर एक टूटा पीडीएफ होगा। नुकसान पहुंचाने के लिए उन्हें मैन्युअल रूप से .exe पर फिर से टाइप करना होगा।

वास्तविक समस्याओं कर रहे हैं:

  1. कुछ ब्राउज़र फ़ाइल की सामग्री सूंघ सकते हैं और तय है कि वे इसे है किस प्रकार की फ़ाइल के बारे में आप की तुलना में बेहतर जानते हैं। आईई इस पर विशेष रूप से खराब है, फ़ाइल को एचटीएमएल के रूप में प्रस्तुत करना पसंद करते हैं यदि यह किसी भी एचटीएमएल टैग को फ़ाइल की शुरुआत के करीब छिपता हुआ देखता है। यह कण्य अनुपयोगी है क्योंकि इसका मतलब है कि स्क्रिप्ट को आपकी साइट पर इंजेक्शन दिया जा सकता है, संभावित रूप से किसी भी एप्लिकेशन-स्तरीय सुरक्षा (कुकी चोरी एट अल) से समझौता करना।वर्कअराउंड में हमेशा सामग्री-डिस्पोजिशन का उपयोग करके अनुलग्नक के रूप में फ़ाइल की सेवा करना, और/या किसी भिन्न होस्टनाम से फ़ाइलों की सेवा करना शामिल है, इसलिए यह आपकी मुख्य साइट पर क्रॉस-साइट-स्क्रिप्ट वापस नहीं जा सकता है।

  2. पीडीएफ फाइलें वैसे भी सुरक्षित नहीं हैं! वे स्क्रिप्टिंग से भरे जा सकते हैं, और महत्वपूर्ण सुरक्षा छेद हैं। पीडीएफ रीडर ब्राउज़र प्लगइन में एक छेद का शोषण वर्तमान में वेब पर ट्रोजन स्थापित करने के सबसे आम साधनों में से एक है। और लगभग कुछ भी नहीं है जो आप आम तौर पर शोषण का पता लगाने की कोशिश करने के लिए कर सकते हैं क्योंकि उन्हें अत्यधिक अपमानित किया जा सकता है।

1

** NIX * सिस्टम पर हम एक उपयोगिता फ़ाइल (1) कहा जाता है। विंडोज के लिए कुछ समान खोजने की कोशिश करें, लेकिन फ़ाइल उपयोगिता अगर स्वयं पोर्ट किया गया है।

0

निम्नलिखित सी ++ कोड आप मदद कर सकता है:

//-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; 
} 
संबंधित मुद्दे