2013-11-22 13 views
9

मेरा वेबपैप उपयोगकर्ता को जार फ़ाइल अपलोड करने की अनुमति देता है। हालांकि, जार फ़ाइल अपलोड होने के बाद, यह दूषित है। मैंने md5 चेकसम (winmd5free) की तुलना करके इसे सत्यापित किया है।कैसे जांचें कि एक जार फ़ाइल मान्य है या नहीं?

अपलोड जार फ़ाइल लग रहा है "सामान्य" और "सही"

  • फ़ाइल आकार मूल की तुलना में सही लग रहा है (KB स्तर पर)
  • मैं 7z का उपयोग करके अपलोड जार फ़ाइल खोल सकते हैं और इसकी सामग्री (संसाधन और कक्षा फाइल) देखें, और मूल

जब मैं अपलोड की गई जार फ़ाइल (नोटपैड ++ का उपयोग करके) खोलता हूं, तो सबकुछ वैसा ही है, बाइनरी सामग्री मूल से भिन्न होती है । साथ ही, जब मैंने जार प्रविष्टियों को पढ़ने के लिए जारइनपुटस्ट्रीम का उपयोग किया, तो कोई प्रविष्टियां नहीं थीं।

JarInputStream is = new JarInputStream(new FileInputStream(new File("uploaded.jar"))); 
JarEntry entry = null; 
while(null != (entry = is.getNextJarEntry())) { 
System.out.println(entry.getName()); 
} 

इसके अलावा, जब मैं जार (विंडोज) पर डबल क्लिक करता हूं, तो मुझे निम्न संदेश मिलता है।

Error: Invalid or corrupt jarfile

मेरे सवालों

  • हैं वहाँ एक रास्ता प्रोग्राम के रूप में जांच करने के लिए अगर एक जार फ़ाइल मान्य है है? मैं JarInputStream को तुरंत यह पहचानने की अपेक्षा करता था, लेकिन यह
  • पर कोई समस्या नहीं दिखाता है जब मैं जार फ़ाइल पर डबल क्लिक करता हूं, विंडोज़ में, क्या यह java.exe है जो मुझे अमान्य या दूषित जर्फ़ाइल संदेश दे रहा है?
  • क्लासपाथ के हिस्से के रूप में एक अवैध जार फ़ाइल कब पास की जाती है, कोई त्रुटि/अपवाद फेंक दिया नहीं जाता है? जैसे जावा-सीपी अपलोड.जर; libs * com.some.class.Test?

कृपया ध्यान दें कि इस जार पर हस्ताक्षर करने और/या एक जार पर हस्ताक्षर की जाँच के साथ कोई संबंध नहीं है। यह बस यह जांच रहा है कि कोई फ़ाइल (अपलोड या नहीं) वैध जार फ़ाइल है (जरूरी नहीं कि जार की क्लास फाइल मान्य हैं, क्योंकि इस मुद्दे पर पहले से ही एक और एसओ पोस्ट है)।

परिणाम

jar -tvf uploaded.jar

java.util.zip.ZipException: error in opening zip file 
     at java.util.zip.ZipFile.open(Native Method) 
     at java.util.zip.ZipFile.<init>(ZipFile.java:127) 
     at java.util.zip.ZipFile.<init>(ZipFile.java:88) 
     at sun.tools.jar.Main.list(Main.java:977) 
     at sun.tools.jar.Main.run(Main.java:222) 
     at sun.tools.jar.Main.main(Main.java:1147) 
+1

कमांड लाइन पर, इस तरह की जार कमांड चलाएं: 'jar -tvf '। 'टी' कहता है "परीक्षण", 'वी' मेरा मानना ​​है कि "वर्बोज़" और 'एफ' का मतलब है "फाइल"। आप किसी भी ज़िप कार्यक्रम में एक जार भी खोल सकते हैं। – CodeChimp

+0

धन्यवाद, मैं java.util.zip.ZipFile का उपयोग यह देखने के लिए करूंगा कि क्या मैं प्रोग्रामेटिक रूप से जांच कर सकता हूं (जार टूल के साथ उन विकल्पों को चलाने से स्टैक ट्रेस के संशोधित जोड़े को देखें)। –

+0

@CodeChimp 't'is" JAR फ़ाइल की सूची सामग्री "के लिए जैसा कि आप https://docs.oracle.com/javase/tutorial/deployment/jar/view.html में देख सकते हैं, इसलिए यह सामग्री के चेकसम का परीक्षण नहीं करता है (हालांकि प्रविष्टियों को सूचीबद्ध करने के लिए इसे अधिक कम वैध जार होने की आवश्यकता है)। – PhoneixS

उत्तर

7

एक तरह से चल रहा है प्रोग्राम के रूप में गलत जार फ़ाइल का पता लगाने के लिए java.util.ZipFile उपयोग करने के लिए है।

public static void main(String[] args) { 
    if(args.length < 1) { 
     System.err.println("need jar file"); 
     return; 
    } 

    String pathname = args[0]; 
    try { 
     ZipFile file = new ZipFile(new File(pathname)); 
     Enumeration<? extends ZipEntry> e = file.entries(); 
     while(e.hasMoreElements()) { 
      ZipEntry entry = e.nextElement(); 
      System.out.println(entry.getName()); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

यदि जार फ़ाइल अमान्य है, तो ज़िपफाइल को तुरंत चालू करते समय एक ज़िप अपवाद फेंक दिया जाएगा।

+0

https://docs.oracle.com/javase/8/docs/api/java/util/jar/JarFile.html एक और विकल्प है। –

संबंधित मुद्दे