2010-07-27 13 views
6

मैं php में एक सरल thingy कर रहा हूँ और मैं आश्चर्य है कि अगर चर $ मार्ग का अनुसरण संरचना ../PHP: फ़ोल्डर हैकिंग को रोकें - यदि पथ है ../ इसमें?

तो मैं बस मेरा url में एक? पथ = somepath संरचना होगा शामिल मैं कैसे परीक्षण कर सकते हैं, और अगर कोई प्रवेश करेगा ../ यह उसे एक निर्देशिका में जाने की अनुमति देता है। मुझे निश्चित रूप से पता है कि यह सबसे अच्छा समाधान नहीं है, हालांकि मेरी छोटी चीज़ के लिए यह पर्याप्त है अगर मैं केवल "../" की स्ट्रिंग के लिए $ पथ चर का परीक्षण करता हूं। अगर ऐसा मर जाए();

मुझे यकीन नहीं है कि इसका परीक्षण करने का सबसे अच्छा तरीका क्या है!

संबंध है मैट

+0

किस उद्देश्य के लिए आप इस तरह के पथ का उपयोग कर रहे हैं? –

+0

@ माथी मैं उलझन में हूं कि आप एक लिंक में वास्तविक यूआरएल के बजाय '? Path = url' क्यों भेज रहे हैं। सुरक्षा कीड़े का उद्घाटन मैं आपको बता सकता हूं। –

+0

क्योंकि मैं एक फाइलब्रोसर का निर्माण कर रहा हूं जो मेरे सर्वर पर मेरी फाइलें पढ़ता है। एक फ़ाइल में संपूर्ण उपयोगकर्ता इंटरफेस होता है। $ पथ फ़ोल्डरपैथ सेट करता है जो वर्तमान में मेरे फ़ाइलब्रोसर में फ़ोल्डर को देखा जाता है। मैं सिर्फ वास्तविक यूआरएल सेट नहीं कर सकता, मेरी परियोजना के लिए समझ में नहीं आता है। – matt

उत्तर

1

अपने सवाल का जवाब देने:

if(strpos($path,'../') !== false){ 
    // looks like someone 's trying to hack here - simply 
    // do nothing (or send an email-notification to yourself 
    // to be informed and see how often this happens) 
}else{ 
    // here comes the magic 

} 

लेकिन: तुम सच में ऐसा नहीं करना चाहिए। यदि आप एक आसान समाधान चाहते हैं, तो प्रत्येक संभावित $ पथ के लिए स्विच-स्टेटमेंट का उपयोग करें और प्रासंगिक फ़ाइल (या जो भी आपको करना है) शामिल करें।

+1

भाषा के लिए कोई कारण? – RobertPitt

+0

@RobertPitt: मैं किसी को अपमानित नहीं करना चाहता - मुझे आशा है कि यह अब बेहतर होगा;) – oezi

+1

+ के साथ वोट को बदलें, यह मेरे लिए अपमानजनक नहीं है लेकिन अन्य लोग इसे उस पोस्ट के लिए अनदेखा कर पाएंगे :), खुश दिन – RobertPitt

11

इसके बजाय कि ऐसा करने का, तो आप सिर्फ उस पर realpath() फोन और देखें कि क्या पथ उस में होना चाहिए है कि का एक उपसर्ग है सकता है।

इससे भी बेहतर, श्वेतसूची क्यों न रखें और इसमें कुछ भी अस्वीकार न करें?

0

मैं कोई वैकल्पिक समाधान है कि आप यूआरएल को अनुकूलित करने के लिए अनुमति देते हैं ....

<?php 
$arr= array(
    "register" => "register.php", 
    "login" => "userlogin.php", 
    "admin" => "adminlogin.php", 
    "etc" => "otherpage.php", 
); 
if (isset ($_GET['path'])  
    if (array_key_exists($_GET['path'] , $arr)){ 
     //do some stuff... 
     include($arr[$_GET['path']]); 
    } 
    else 
     echo 'Page Not Found!';   
else 
    echo 'Required Field Empty!';  
?> 

तो कॉल कर रहा है index.php?path=admin पेज adminlogin.php शामिल किया जाएगा ....

+0

यह भी सुनिश्चित करती है कि अगर आपके उपयोग RobertPitt

+0

वास्तव में नहीं .. क्योंकि (अगर php ठीक से कॉन्फ़िगर किया गया है) 'index.php? arr [ihack] = ....' केवल $ $ से php द्वारा पहुंचा जा सकता है _GET ['arr'] '... और '$ arr' php स्क्रिप्ट में प्रतिस्थापित नहीं किया जाएगा .... – Marcx

+0

लेकिन इससे भी बदतर है SQLinjection' index.php? Arr =?> ड्रॉप तालिका "' !!! –

0

आसान तरीकों में से एक कठोर है आपकी php.ini कॉन्फ़िगरेशन, विशेष रूप से open_basedir directive। ध्यान रखें, कुछ सीएमएस सिस्टम वास्तव में कोड में ..\ का उपयोग करते हैं, और जब रूट फ़ोल्डर के बाहर शामिल होते हैं तो यह समस्याएं पैदा कर सकता है। (यानी नाशपाती मॉड्यूल)

mod_rewrite का उपयोग करने का एक और तरीका है।

जब तक आप $_GET और $_SERVER['request_uri'] चर से इंजेक्शन के लिए प्रत्येक URL को जांचने के लिए फ़ाइल शामिल नहीं कर रहे हैं, तो आप इस तरह के हमले के लिए दरवाजे खोलेंगे। उदाहरण के लिए, आप index.php की रक्षा कर सकते हैं लेकिन submit.php नहीं। यही कारण है कि php.ini और .htaccess सख्त करना पसंदीदा तरीका है।

+0

mod_rewrite कुछ भी मदद नहीं कर सकता –

+0

@col आप गंभीर नहीं हो सकते .. –

+0

'index.php? Arr =?> ड्रॉप टेबल 'और/आइटम/ड्रोप टेबल /' के बीच कोई अंतर नहीं है। जाओ पता लगाओ –

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