2013-02-10 19 views
7

में एक निष्पादन योग्य फ़ाइल का पता लगाएं मेरे पास एक उपयोग केस है जहां हम उपयोगकर्ताओं को फ़ाइलों को अपलोड करने की अनुमति दे रहे हैं। अब बैक एंड जावा (नियंत्रक जो http अनुरोध और चेक से फ़ाइल निकालता है) में, मैं यह जानना चाहता हूं कि उपयोगकर्ता किसी निष्पादन योग्य फ़ाइल को अपलोड करता है या नहीं। अगर वह अपलोड करता है, तो मुझे उस फाइल को त्यागना होगा। मैंने इसे गुगल किया है लेकिन एक अच्छा समाधान नहीं मिला। कुछ लोगों ने विस्तार (.exe) सत्यापित करने का सुझाव दिया। लेकिन मुझे यकीन नहीं है कि यह exe फ़ाइलों को कितनी दूर फ़िल्टर करेगा। मैं निष्पादन योग्य फ़ाइलों को अपलोड करने से पूरी तरह से ब्लॉक करना चाहता हूं।जावा

यदि आप में से कोई भी इस परिदृश्य में आया है या इसके बारे में समाधान है, तो कृपया मुझे बताएं। मैं आपके लिए आभारी रहूंगा।

यदि आप मुझे किसी भी जावा कार्यान्वयन या जावा एपीआई या एल्गोरिदम को इंगित कर सकते हैं तो मैं अधिक खुश रहूंगा जो यह काम करता है।

+0

कोई अन्य सुझाव? – Rajeev

उत्तर

9

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

हालांकि, ऐसी कुछ चीजें हैं जिन्हें आप कुछ प्रकार निष्पादन योग्य में देख सकते हैं। उदाहरण के लिए:

  • विंडोज Portable Executable प्रारूप है, जो हमेशा जादुई संख्या 4d5a (ASCII वर्ण MZ)
  • ELF प्रारूप निष्पादन लिनक्स द्वारा इस्तेमाल किया साथ शुरू करना चाहिए 7f454c46
  • Java class files के साथ शुरू का उपयोग करता है हमेशा cafebabe के साथ शुरू (वह हेक्स है, ASCII नहीं!)।
  • जहां तक ​​मैं देख सकता हूँ, मच-ओ मैक OSX द्वारा उपयोग की गई फ़ाइलों जादुई संख्या feedface (फिर हेक्स)

मैं तुम्हें एक FileInputStream या इसी तरह बना सकते हैं और के पहले कुछ बाइट्स पढ़ सुझाव है है फ़ाइल, इन जादू संख्याओं की जांच। यह निष्पादन योग्य कोड वाली किसी भी फ़ाइल का पता नहीं लगाता है, लेकिन इसे इन मानक निष्पादन योग्य प्रारूपों में फ़ाइलों को अनुमति देने से रोकना चाहिए, जो मुझे लगता है कि आप क्या उम्मीद करते हैं।

उदाहरण के लिए

तो:

public static boolean isExecutable(File file) { 
    byte[] firstBytes = new byte[4]; 
    try { 
    FileInputStream input = new FileInputStream(file); 
    input.read(firstBytes); 

    // Check for Windows executable 
    if (firstBytes[0] == 0x4d && firstBytes[1] == 0x5a) { 
     return true; 
    } 
    return false; 
    } 
    catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

भी सावधान रहना है कि यह एक झूठी सकारात्मक पाने के लिए जहाँ आप एक फ़ाइल जो निष्पादन योग्य नहीं था अस्वीकार संभव है। मुझे नहीं पता कि आप किस प्रकार की फाइल अपलोड कर रहे हैं, इसलिए आपको यह समझना चाहिए कि ऐसा होने के लिए कितना संभव है।

+0

आपके सुझाव के लिए धन्यवाद। मैं विकी के माध्यम से चला गया है और इसी तरह के समाधान मिल गया है। नीचे दिए गए विकीज़ हैं: http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/pefile2.html मैं वास्तव में अधिक खुश हूं, अगर आप मुझे मार्गदर्शन कैसे कर सकते हैं जावा – Rajeev

+0

हां में उल्लिखित उपरोक्त तीन संविधान हां, जो पुष्टि करता है कि मुझे क्या मिलेगा: विंडोज एक्जिक्यूटिव हमेशा एएससीआईआई 'एमजेड' (या हेक्स '4 डी 5 ए') से शुरू होते हैं। मैक ओएसएक्स के साथ-साथ – jazzbassrob

+0

को शामिल करने के लिए मैंने अपना जवाब अपडेट कर लिया है मैंने विंडोज के लिए कोड नमूना के साथ अद्यतन किया है। दूसरों को परीक्षण करने के तरीके के बारे में काम करने के लिए मैं इसे छोड़ दूंगा। उम्मीद है की वो मदद करदे। – jazzbassrob

0

विंडोज निष्पादन योग्य हमेशा MZ जादू संख्या से शुरू होता है। शायद आप इसके लिए जांच सकते हैं।

+0

मैं विकी से गुजर चुका हूं और दो विकीज़ नीचे पाया है: http://www.delphidabbler.com/articles?article=8&part=1 http://stackoverflow.com/questions/2863683/how-to-find-if -a-file-is-an-exe लेकिन इतना स्पष्ट नहीं है। उन्होंने पीई को चकित करने के लिए सुझाव दिया है .. लेकिन – Rajeev

0

जहां तक ​​मैंने देखा है, सबसे सामान्य तरीका एक्सटेंशन को सत्यापित करना है। उदाहरण के लिए मैंने देखा है कि मेल क्लाइंट आमतौर पर निष्पादन योग्य भेजने के लिए स्वीकार करते हैं यदि इसका नाम बदल दिया गया है उदा। ज़िप या कुछ अन्य एक्सटेंशन के लिए।
मुझे विश्वास है कि यह सुरक्षा समस्या है क्योंकि उपयोगकर्ता गलती से निष्पादन योग्य चलाता है। किसी अज्ञात/अलग एक्सटेंशन में फ़ाइल का नाम बदलकर उपयोगकर्ता गलती से ऐसा नहीं कर सकता है और इसलिए खतरे किसी भी तरह से "कमजोर"
अन्यथा फ़ाइल सामग्री को देखने के लिए एक तरीका के साथ आ रहा है यह निर्धारित करने के लिए कि वास्तव में आपके पास निष्पादन योग्य है या नहीं, मैं नहीं जानता कि यह कैसे संभव/पोर्टेबल/विश्वसनीय है

0

यहाँ एक नज़र:

Is there a good way to determine if a file is executable in Java

इस आदेश की तरह लगता है मदद मिल सकती है: java.io.File.canExecute()

+1

दुर्भाग्य से यह जांचने और कार्यान्वित करने के तरीके के बारे में अधिक जानकारी चाहिए कि यह केवल यह निर्धारित करता है कि फ़ाइल को निष्पादित करने के लिए * अनुमति * है या नहीं - यह वास्तव में निष्पादन योग्य कोड – jazzbassrob

+0

है जैसे जैज़बास्ब्रोब ने कहा, यह मदद नहीं करेगा। यह फ़ाइल में निष्पादन योग्य डेटा का पता नहीं लगा सकता है या नहीं – Rajeev

+0

मैं आपके द्वारा उल्लिखित लिंक से पहले ही जा चुका हूं। यह सवाल से संबंधित नहीं है मैं बिल्कुल पूछ रहा हूं .... – Rajeev

0

पता है कि विंडोज़ निष्पादन न केवल .exe फ़ाइलें इतना विस्तार जाँच पर्याप्त नहीं होगा रहे हैं रहो

आप मूर्ख के लिए कुछ उन्नत और मुश्किल चाहते हैं, आप उपयोग कर सकते हैं File for Windows की तरह एक तीसरी पार्टी उपकरण यह एक लोकप्रिय है कमांड लाइन उपकरण जिसे लिनक्स से पोर्ट किया गया था।

उदाहरण के लिए

, जैसे

PE32 executable for MS Windows <GUI> Intel 

कुछ आप एक जावा प्रोग्राम से इस उपकरण चला सकते हैं आप कुछ फ़ाइल program.exe

C:\file -b "program.exe" 
जाँच करना चाहते हैं, तो Runtime.getRuntime().exec()

का उपयोग कर

परिणाम हो जाएगा कमांड लाइन प्रोग्राम को चलाने के तरीके को जानने के लिए this question देखें और जावा

में आउटपुट प्राप्त करें

आप फ़ाइल सामग्री को अपनी सामग्री से प्राप्त करने के लिए Apache Tika भी देख सकते हैं

+0

मैं जावा में यह कैसे कर सकता हूं? – Rajeev

+0

मुझे निर्भर करने की क्या निर्भरता है ... यदि आप नमूना प्रोग्राम प्रदान कर सकते हैं जो निष्पादन योग्य फ़ाइलों का पता लगाता है तो यह सभी के लिए अधिक उपयोगी होगा?यह भी आपको आभारी है कि यदि आप इस विधि का उपयोग करने के नकारात्मकों पर प्रकाश डाल सकते हैं जैसे किनारे के मामलों के लिए इसे याद किया जा सकता है या यह सामान्य फ़ाइल को निष्पादन योग्य के रूप में देख सकता है। – Rajeev

+0

यदि आप 'cmd' से कमांड चलाने में सक्षम हैं, तो आपको जावा (जैसे जार) में कुछ भी जोड़ने की आवश्यकता नहीं है, आप इसे 'getRuntime()। Exec()' – iTech