2009-05-11 9 views
7

मैं एक सरल PHP में स्क्रिप्ट लिस्टिंग निर्देशिका को लागू कर रहा हूँ में सुरक्षित है।उपयोगकर्ता-निर्धारित पथ पीएचपी

मैं सुनिश्चित करना है कि पारित कर दिया पथ निर्देशिका हैंडल खोलने और echo परिणाम ing बिना सोचे समझे से पहले सुरक्षित है चाहता हूँ।

$f = $_GET["f"]; 
if(! $f) { 
    $f = "/"; 
} 
// make sure $f is safe 
$farr = explode("/",$f); 
$unsafe = false; 
foreach($farr as $farre) { 
    // protect against directory traversal 
    if(strpos($farre,"..") != false) { 
     $unsafe = true; 
     break; 
    } 
    if(end($farr) != $farre) { 
     // make sure no dots are present (except after the last slash in the file path) 
     if(strpos($farre,".") != false) { 
      $unsafe = true; 
      break; 
     } 
    } 
} 

यकीन है कि एक पथ उपयोगकर्ता द्वारा भेजे गए सुरक्षित है बनाने के लिए यह पर्याप्त है, या कुछ अन्य बातों हमले के खिलाफ की रक्षा करने के लिए मुझे क्या करना चाहिए रहे हैं?

+1

आप अपने वैरिएबल नहीं foreach में बंद() – Greg

+0

: कि खरीदने के लिए हे धन्यवाद ... –

उत्तर

9

हो सकता है कि realpath() आप के लिए उपयोगी है।

realpath() '/../' और इनपुट पथ में अतिरिक्त '/' पात्रों सब सांकेतिक लिंक फैलता है और '/./' के लिए संदर्भ का समाधान करता है, और canonicalized पूर्ण पथ नाम देता है।

हालांकि, इस समारोह मान लिया गया है कि प्रश्न में पथ वास्तव में मौजूद है। यह एक मौजूदा डेटा के लिए canonization प्रदर्शन नहीं करेगा। इस मामले में गलत लौटा दिया गया है।

+0

तो मैं realpath() पारित मार्ग पर प्रदर्शन करते हैं, और देखें कि क्या यह मेरा 'सुरक्षित' निर्देशिका के नीचे है? –

+0

बिल्कुल। चूंकि आपको नो-बकवास पथ वापस (या FALSE) मिलता है, इसलिए आप चेक के रूप में एक साधारण सबस्ट्रिंग तुलना कर सकते हैं। – Tomalak

+0

मेरे लिए अच्छा लगता है। धन्यवाद! –