2011-11-06 15 views
9

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

प्रश्न: क्या "बुरी फाइलें" को माइम प्रकार स्पूफिंग के साथ आने से रोकने के लिए कोई और तकनीक है?

+2

क्या माइम प्रकार स्पूफिंग के बारे में आपका प्रश्न है, या आप सिर्फ यह जानना चाहते हैं कि अपलोड की गई फाइलों को सत्यापित करने के लिए कि वे छवि फाइलें हैं या नहीं? – CodeCaster

+0

वास्तव में, आपको पहले स्थान पर एमआईएम प्रकारों और फ़ाइल एक्सटेंशन पर भरोसा नहीं करना चाहिए (और आपकी जांच, अगर माइम-> एक्सटेंशन भी गलत है; अगर मैं नकली माइम नकली कर सकता हूं तो मैं नकली नकल कर सकता हूं और अधिक आसानी से एक समान फ़ाइल xtension) –

+0

@CodeCaster: यह सुनिश्चित करने के लिए कि फ़ाइलों को अपलोड किए गए फ़ाइलों के MIME प्रकारों को धोखा नहीं दिया गया है? – abruski

उत्तर

8

लघु जवाब: नहीं

लंबे समय तक जवाब:

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

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

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

लेकिन फिर भी, फ़ाइल को सावधानीपूर्वक तैयार किया जा सकता है कि जब आप छवि प्रदर्शित करते हैं, तो उस छवि को प्रदर्शित करने के लिए उपयोग की जाने वाली एक लोकप्रिय लाइब्रेरी (उदाहरण के लिए libpng इत्यादि) एक बफर ओवरफ़्लो में चलेगी जो हमलावर उसमें पाया जाता है पुस्तकालय।

असुविधाजनक रूप से क्लाइंट पक्ष से किसी भी इनपुट की इजाजत देने के अलावा सक्रिय रूप से इसे रोकने का कोई तरीका नहीं है।

+0

छवियां केवल उदाहरण थे। पीडीएफ फाइलों से निपटेंगे। लेकिन मैं इस सवाल को सामान्य बनाना चाहता था ताकि यह अन्य फ़ाइल प्रकारों के साथ भी मदद करे – abruski

+1

सिद्धांत हमेशा एक जैसा है। एक स्मार्ट हमलावर आपको जो अपेक्षा करता है वह देता है, लेकिन फ़ाइल को इस तरह से शिल्प करता है कि यह फ़ाइलों को देखने के लिए उपयोग की जाने वाली सबसे लोकप्रिय पुस्तकालयों का शोषण करता है। पीडीएफ के लिए इसका मतलब यह होगा कि वे जावास्क्रिप्ट, वीडियो, फिर से छवियों को एम्बेड कर सकते हैं ... डेटा प्रारूप द्वारा प्रदान की गई सुविधाओं के साथ विकल्पों की संख्या में काफी वृद्धि हुई है। यदि आप (या आपके क्लाइंट!) कभी भी "निष्पादित नहीं होते" (देखने को "निष्पादित" भी किया जाता है) अपलोड की गई सामग्री, केवल तभी आप सुरक्षित हैं। – emboss

+0

जीडी जैसी लाइब्रेरी या इमेजमैजिक जैसे टूल का उपयोग करके इसे एक नई छवि में कॉपी करके "सुरक्षित" छवि प्राप्त करना संभव है। AFAIK, इनमें से किसी भी पुस्तकालय के लिए कोई ज्ञात खुला शोषण नहीं है - वहां विंडोज़ जीडीआई में एक होता था लेकिन यह तब से तय किया गया है। हालांकि यह सच है कि सिद्धांत में, कोई सुरक्षा नहीं है, वहां * सुरक्षित तरीके से फ़ाइलों से निपटने के तरीके हैं। –

-4

एक्सटेंशन की जांच करें।

<?php 

$okFiles = array('jpg', 'png', 'gif'); 

$pathInfo = pathinfo($filename); 

if(in_array($pathInfo['extension'], $okFiles)) { 
    //Upload 
} 
else { 
    //Error 
} 

?> 

आप भी कह सकते हैं - जैसे कि एक्सटेंशन एमआईएमई प्रकार से मेल खाता है, लेकिन एक्सटेंशन को जांचना कहीं अधिक आसान है।

बीटीडब्ल्यू आप एमआईएमई प्रकार के बारे में क्यों परवाह करते हैं?

+0

यह सुनिश्चित करने के लिए कि अपलोड की गई फ़ाइल वह प्रतीत होती है। कल्पना कीजिए: MIME छवि अपलोड करें लेकिन ext php और php कोड के अंदर; अपलोड डीआईआर ब्राउज़र सुलभ है और साथ ही मुझे लगता है कि हमलावर स्वतंत्र रूप से कुछ दुर्भावनापूर्ण कोड चला सकता है। – abruski

+1

@abruski तो आपको एमआईएमई प्रकार की जांच करने की आवश्यकता नहीं है। बस एक्सटेंशन की जांच करें। यदि यह jpg/png/gif है तो यह ठीक है, अन्यथा एक त्रुटि "बस jpg/png/gif" फेंक दें। यह नहीं पता कि यह वही है जो आप डरते हैं, लेकिन यदि एक्सटेंशन है .jpg और MIME sais PHP यह फ़ाइल पर ब्राउज़ करते समय भी एक छवि के रूप में माना जाएगा। – Sawny

+0

यह भी माना जाता है। बस यह सुनिश्चित करने की कोशिश कर रहा हूं कि मैं सही रास्ते पर हूं। – abruski

4

छवियाँ

  • चेक अनुमति लोगों की सूची के साथ विस्तार (उदा। ".jpg", ".jpeg", ".png") के मामले में
  • द्वारा अपलोड की गई फ़ाइल में ही चेक फ़ाइल पर getimagesize चला रहा है, अगर यह छवि नहीं है तो यह गलत होगा।

अपलोड के अन्य प्रकार

  • चेक अनुमति एक्सटेंशन (उदा। ".pdf")
  • चेक उस फ़ाइल की माइम प्रकार विस्तार

नमूना से मेल खाती है कोड:

function getRealMimeType($filename) { 
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) { 
     echo "Opening fileinfo database failed"; 
     return ""; 
    } 
    return $finfo->file($filename); 
} 

देखेंदस्तावेज।

+0

यह एक छवि नहीं है, यह किसी भी प्रकार की फाइल हो सकती है। – abruski

+0

मैं देखता हूं, मुझे जवाब का विस्तार करने दें। – stivlo

+0

बहुत अच्छा है अगर getimagesize झूठी वापसी करता है यदि यह छवि नहीं है :-) आईडी अनुमान लगाने के लिए बहुत उपयोगी है, लेकिन क्या होगा यदि एक्सटेंशन खराब हो और माइम प्रकार भी हो? –

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