2009-10-19 9 views
12

मेरे पास php में एक वेबसाइट है जिसमें सामग्री को टेम्पलेट में एम्बेड करने के लिए() शामिल है। लोड करने के लिए पृष्ठ को पैरामीटर में दिया गया है, मैं पैरामीटर के अंत में ".php" जोड़ता हूं और उस पृष्ठ को शामिल करता हूं। मुझे XSS या अन्य सामान से बचने के लिए कुछ सुरक्षा जांच करने की आवश्यकता है (MySQL इंजेक्शन नहीं क्योंकि हमारे पास डेटाबेस नहीं है)। मैं जो आया हूं वह निम्नलिखित है।

$page = $_GET['page']; 

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || 
    !strpos($page, '\\') || !strpos($page, '..')) { 
     //append ".php" to $page and include the page 

क्या कोई अन्य चीज है जो मैं अपने इनपुट को और अधिक स्वच्छ करने के लिए कर सकता हूं?

+4

स्ट्रॉप्स() जैसे परिणाम की जांच न करें - यह स्ट्रिंग की शुरुआत में है, तो यह शून्य वापस आ जाएगा, जो झूठी –

+0

@Tom का मूल्यांकन करेगा, Acceppted समाधान देता है मैं भी उससे बचता हूं, वैसे भी धन्यवाद, मुझे भविष्य के कोड के लिए आपकी सलाह याद रहेगी। –

+0

यह भी देखें: http://stackoverflow.com/a/15825812/59087 –

उत्तर

27
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

शायद इस को साफ़ करने में सबसे तेज तरीका है, इस के लिए कुछ भी लेने के लिए और है कि यह केवल अक्षर, संख्या, अंडरस्कोर या डैश शामिल यकीन है कि कर देगा।

+1

अभी भी हेक्स कोड का उपयोग करके हमला कर सकता है: http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sfulicient-to- रोकथाम-एसक्यूएल-इंजेक्शन/12202218 # 12202218 और http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

दोनों लिंक mysql के बारे में हैं और यह सवाल एसक्यूएल इंजेक्शन – NikkyD

3

अपने स्रोत कोड में मौजूद पृष्ठों की एक स्पष्ट सूची परिभाषित करें और फिर इनपुट जांचने के लिए इसका उपयोग करें। हां, यह अधिक काम है, लेकिन यह बहुत स्पष्ट करता है कि क्या अनुमति है और क्या नहीं है। उदाहरण के लिए:

$AVAILABLE_PAGES = array('home', 'news', ...); 
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1); 

$page = $_GET['page']; 
if (!$AVAILABLE_PAGES[$page]) { 
    header("HTTP/1.0 404 Not Found"); 
    die('Page not found.'); 
} 

include "pages/$page.php"; 
7

"sanitize" न करें - हमले डेटा के उपयोग के लिए विशिष्ट हैं, स्रोत नहीं। मूल्यों से बचें जैसे आप उन्हें आउटपुट करते हैं। यह भी देखें कि What’s the best method for sanitizing user input with PHP?

+0

के बारे में नहीं है, मैंने इसे पढ़ा है, लेकिन मुझे नहीं लगता कि यह उस वेबसाइट पर फिट बैठता है जिस पर मैं काम कर रहा हूं। –

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