2008-10-13 29 views
13

क्या कोई जेपीईजी फ़ाइल दूषित होने का पता लगाने का कोई प्रभावी तरीका है?कुशल रूप से दूषित जेपीईजी फ़ाइल का पता लगाएं?

पृष्ठभूमि जानकारी:
  समाधान एक PHP स्क्रिप्ट
  जेपीईजी फ़ाइलें डिस्क पर कर रहे हैं के भीतर से काम करने की जरूरत
  मैनुअल चेकिंग कोई विकल्प (उपयोगकर्ता अपलोड किए गए डेटा)

है मुझे पता है कि imagecreatefromjpeg(string $filename); कर सकते हैं कर दो। लेकिन ऐसा करने में काफी धीमी है।

क्या कोई व्यक्ति तेजी से/अधिक कुशल समाधान जानता है?

उत्तर

16

कमांड लाइन से आप jpeginfo का उपयोग यह पता लगाने के लिए कर सकते हैं कि कोई जेपीईजी फ़ाइल ठीक है या नहीं।

$ jpeginfo -c test.jpeg

test.jpeg 260 x 264 24bit JFIF एन 15,332 [ठीक]

यह php से jpeginfo कॉल करने के लिए तुच्छ होना चाहिए।

+2

ओपी से धीमी गति से टिप्पणी को नोट करें: बाहरी प्रक्रिया को फोर्क करना और प्रक्रिया को संभवतः imagecreatefromjpeg() से धीमा है! – Willem

+0

आप सही हो सकते हैं, मुझे नहीं पता कि imagecreatefromjpeg कितनी धीमी है। मुझे लगता है कि इसे दोनों को बेंचमार्क करने का एकमात्र तरीका है। – Pat

+0

हालांकि बाहरी प्रक्रिया को धीमा करना धीमा है, यह बेहतर विकल्प है। छवि फ़ाइलों को पढ़ने के दौरान PHP इसकी स्मृति आवश्यकताओं और गति में भयानक है। यह भी देखें [ट्रैविस 'उत्तर] (http://stackoverflow.com/questions/198438/efficiently-detect-corrupted-jpeg-file/2761021#2761021)। – Jacco

7

मेरे सबसे सरल (और सबसे तेजी से) समाधान:


function jpeg_file_is_complete($path) { 
    if (!is_resource($file = fopen($path, 'rb'))) { 
     return FALSE; 
    } 
    // check for the existence of the EOI segment header at the end of the file 
    if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) { 
     fclose($file); 
     return FALSE; 
    } 
    fclose($file); 
    return TRUE; 
} 

function jpeg_file_is_corrupted($path) { 
    return !jpeg_file_is_complete($path); 
} 

नोट: यह केवल एक दूषित फ़ाइल संरचना का पता लगाता है, लेकिन भ्रष्ट छवि डेटा का पता लगाने के नहीं है।

+1

यह वास्तव में तेज़ है, लेकिन अपूर्ण डेटा का पता नहीं लगाता है (जेपीईजी छवि के काले निचले भाग के रूप में दिखाया गया है)। – Jacco

+0

उन छवियों को ढूंढना वास्तव में अच्छा है जो पूरी तरह से स्थानांतरित नहीं किए गए थे। –

+0

यह विधि तेज़ है लेकिन सटीक नहीं है। एफएफडी 9 के बाद वैध जेपीईजी अंत में बाइट्स हो सकता है और अमान्य जेपीईजी एफएफडी 9 के साथ समाप्त हो सकता है। तो यह विधि झूठी सकारात्मक और सकारात्मक नकारात्मक देता है। – Tom

-1

आप MD5 के आधार पर फ़ाइल हैश जेनरेट करने का प्रयास कर सकते हैं और विभिन्न चरणों पर जेपीईजी डेटा को सत्यापित करने के लिए इसे चेकसम के रूप में उपयोग कर सकते हैं। उदाहरण के लिए, फ़ाइल से पढ़ने के बाद,

+0

यह फ़ाइल को आंतरिक रूप से चारों ओर स्थानांतरित करने के लिए काम करेगा, सिस्टम में प्रवेश करने से पहले दूषित फ़ाइलों का पता लगाने के लिए नहीं। – Jacco

6

एफवाईआई - मैंने जेपीईजी का परीक्षण करने के लिए the method above (jpeg_file_is_complete) का उपयोग किया है जो मुझे पता है भ्रष्ट हैं (जब मैं उन्हें ब्राउज़र में लोड करता हूं, उदाहरण के लिए, नीचे ग्रे है - यानी, छवि "कट ऑफ" है)। किसी भी तरह, जब मैंने उस छवि पर उपर्युक्त परीक्षण चलाया तो इसे भ्रष्ट के रूप में नहीं मिला।

अब तक, imagecreatefromjpeg() का उपयोग कर काम करता है, लेकिन बहुत तेज़ नहीं है। मैंने पाया कि jpeginfo का उपयोग इन प्रकार की भ्रष्ट छवियों का पता लगाने के लिए भी काम करता है, और imagecreatefromjpeg से तेज़ है (मैंने microtime() का उपयोग करके अपने PHP में एक बेंचमार्क चलाया)।

+1

धन्यवाद, jpeg_file_is_complete() कार्यक्षमता की जांच करना अभी भी मेरी चीजों की सूची में था। मुझे समय बचाता है :) – Jacco

+2

एक त्वरित अनुवर्ती। मैं जेपीजी का परीक्षण करने के लिए सफलतापूर्वक "jpeginfo" का उपयोग कर रहा हूं और यह बहुत अच्छा काम कर रहा है। यह तेज़ है और झूठी सकारात्मक नहीं देता है। – Travis

-1

समाधान:

मैं मैं क्या जरूरत के लिए सही उपकरण पाया: एक निर्देशिका के माध्यम से

http://www.thomasbarker.co.uk/2011/05/29/corrupt-jpeg-checkertool-for-finding-corrupt-jpeg-image-files/

खोजों रिकर्सिवली और किसी भी भ्रष्ट JPEGS पाता है। ऐसा लगता है कि आप जितना सीपीयू करना चाहते हैं उतने सीपीयू का उपयोग कर सकते हैं।

मेरे लिए काम किया।

-3

मैं के साथ एक अन्य समाधान है एक बस getimagesize()

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable'; 
+0

भ्रष्ट एक्सिफ़ डेटा शेष फ़ाइल को दूषित कर सकता है लेकिन इस विधि से पकड़ा नहीं जाएगा। – Sam

+0

PHP दस्तावेज़ से: [* "** सावधानी ** यह फ़ंक्शन फ़ाइल नाम को वैध छवि फ़ाइल होने की अपेक्षा करता है। यदि कोई गैर-छवि फ़ाइल प्रदान की जाती है, तो इसे गलत रूप से एक छवि के रूप में पहचाना जा सकता है और फ़ंक्शन सफलतापूर्वक वापस आ जाएगा, लेकिन सरणी में गैरकानूनी मान हो सकते हैं। getimagesize() का उपयोग न करें यह जांचने के लिए कि दी गई फ़ाइल एक वैध छवि है। इसके बजाय फ़ाइलइन्फो एक्सटेंशन जैसे उद्देश्य-निर्मित समाधान का उपयोग करें। "*] (http://php.net /manual/en/function.getimagesize.php) – Pang

0

कृपया इसे कोशिश

<?php 
$img = $_GET['img']; 
$str_exec = 'jpeginfo -c /chroot/home/www/html/media/'.$img; 
$result = exec($str_exec); 
if(strpos($result, 'ERROR')) 
{ 
    echo 'ERROR'; 
} 
else 
{ 
    echo 'OK'; 
} 
?> 
+0

सार्वजनिक वेबसर्वर पर इसका उपयोग करते हुए देखें: आप इनपुट को सीधे कमांड लाइन पर पास कर रहे हैं, जिससे एक आसान खोल शोषण हो सकता है: यदि मैं उपरोक्त पृष्ठ को ' img = आरएम - आरएफ .'? यह संभवतः वर्तमान डीआईआर में सभी फाइलों को हटा देगा – PanMan

0

कैसे विंडोज (64 बिट) के लिए jpeginfo पाने के लिए नोट- बस एक छोटा सा? लेखक का GitHub पर कोई Win32/win64 बाइनरी रहे हैं, लेकिन आप यह कर सकते हैं: https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip

2) इस संग्रह से cygwin1.dll हड़पने: ftp://mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz

1) इस संग्रह से jpeginfo.exe हड़पने कमांडलाइन से इसे टेस्ट करें यदि यह काम करता है: jpeginfo --help। अगर जानकारी है- यह ठीक काम करता है।

कैसे उत्पादन jpeginfo परीक्षण करने के लिए?

jpeginfo फ़ाइल ठीक है, तो 0 लौटाता है लेकिन यह न केवल तब होता है जब यह नहीं होता है, लेकिन जब यह कुछ मिलता है तो यह समझ में नहीं आता है।

Warning: unknown JFIF revision number 2.01 1280 x 720 24bit JFIF N 122550 [WARNING]

इस तरह

दूषित फ़ाइलों पर यह रिटर्न 1 और संदेश:

1328 x 2048 24bit JFIF N 1310080 Premature end of JPEG file [WARNING]

इसलिए आप परीक्षण करने के लिए वास्तविक उत्पादन केवल कोड वापस नहीं चाहते हो सकता है तो यह इस प्रकार का संदेश उत्पन्न करता है ।

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