2011-10-09 14 views
7

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

  1. उन्हें वेब सुलभ छोड़ दो और सिर्फ एक php प्रवेश पृष्ठ है कि हर फ़ाइल के लिए prepended हो जाता है बनाने के लिए: इस की तुलना में बेहतर 2 विकल्प लगता है। समस्या यह है कि वे सभी php फ़ाइलों नहीं हैं, और मैं एक पीडीएफ, छवि इत्यादि में एक php लॉगिन फ़ाइल प्रीपेड नहीं कर सकता
  2. उन्हें वेब पहुंच योग्य छोड़ दें और संपूर्ण निर्देशिका तक पहुंच प्रतिबंधित करने के लिए HTTP प्रमाणीकरण का उपयोग करें। लेकिन इसमें क्लीयरक्स्ट पासवर्ड, कोई सुंदर लॉगआउट विधि आदि शामिल नहीं हैं।

तो हम उन्हें वेब रूट के बाहर रखने के लिए वापस आ गए हैं लेकिन उन्हें गतिशील रूप से सेवा दे रहे हैं। मेरी समस्या यह है कि, क्योंकि वे सभी अलग-अलग फ़ाइल प्रकार (php स्क्रिप्ट्स, txt, pdf, jpg) हैं, मुझे यकीन नहीं है कि मुझे include() या readfile() का उपयोग करना चाहिए या नहीं। और मैं प्रत्येक फ़ाइल के लिए उचित शीर्षलेख भेजने के साथ समस्याओं में भाग लेता हूं ताकि ब्राउज़र उन्हें सही तरीके से प्रदर्शित कर सके।

क्या मुझे एक और जादू समाधान याद आ रहा है? क्या कोई ढांचा है जिसने मुझे उजागर किया है जो गतिशील फ़ाइलों और शीर्षकों की सेवा को संभालता है?

(FYI मैं लिनक्स, अपाचे & पीएचपी चल रहा हूँ एक साझा मेजबान पर)

+1

वाह, आप एक आसान समस्या ले रहे हैं और इसे कठिन में बदल रहे हैं। –

+2

@Dietrich तब एक आसान समाधान क्या होगा? –

+0

@ पेक्का: HTTP डाइजेस्ट प्रमाणीकरण, उपयोगकर्ताओं को लॉग इन करने के लिए अपने ब्राउज़र बंद करने के लिए कहें। –

उत्तर

8

मुझे लगता है कि कुछ इस तरह काम करेगा:

<?php 
$path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']); 

$parts = explode('/', pathinfo($path, PATHINFO_DIRNAME)); 
if (end($parts) !== 'my_files') { 
    // LFI attempt 
    exit(); 
} 

if (!is_file($path)) { 
    // file does not exist 
    exit(); 
} 

header('Content-Type: ' . mime_content_type($path)); 
header('Content-Length: ' . filesize($path)); 

readfile($path); 
+1

मैं fileinfo कार्यों के साथ 'mime_content_type()' को प्रतिस्थापित करता हूं, लेकिन अन्यथा हाँ। –

0

सबसे आसान तरीका मैं के बारे में सोच सकते हैं का उपयोग करके। htaccess फ़ाइलें। मान लें कि आपका वेब सर्वर अपाचे है।

आप सभी के लिए किसी भी प्रकार की फाइलों और/या निर्देशिकाओं तक पहुंच से इंकार कर सकते हैं और केवल स्थानीयहोस्ट के लिए अनुमति दे सकते हैं। इस तरह, उन्हें जनता के लिए सेवा नहीं दी जाएगी, भले ही वे सही पथ/यूआरएल जानते हों, लेकिन सर्वर और PHP उनकी सेवा करने में सक्षम होंगे।

विभिन्न वेब सर्वरों के लिए, समकक्ष समाधान होना चाहिए। इसके अलावा, आप हमेशा अपाचे पर स्विच कर सकते हैं :-)

+0

ठीक है, जनता से फ़ाइलों को छिपाना समस्या नहीं थी। उन्हें वेब रूट के बाहर ले जाना या .htaccess का उपयोग करके एक्सेस प्रतिबंधित करना मेरे बराबर है। अधिकृत उपयोगकर्ताओं के लिए आवश्यकतानुसार उन फ़ाइलों की चयन करने के लिए मेरी समस्या एक अच्छी विधि है। – Andrew

+0

... और शायद सरल http प्रमाणीकरण का उपयोग किए बिना। अन्यथा, .htaccess अभी भी एक विकल्प होगा। – GolezTrol

+0

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

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