2010-04-16 6 views
7

मेरे पास मेरी साइट पर एक php फ़ाइल है, और मैं डीबी से कनेक्ट करता हूं, कुछ रिकॉर्ड प्राप्त करता हूं और उन्हें उसी फ़ाइल में सूचीबद्ध करता हूं।हैकिंग को रोकने के लिए PHP कोड का टुकड़ा

mysql_connect("localhost", "blabla", "blabla") or die(mysql_error()); 
mysql_select_db("blabla") or die(mysql_error()); 

$blabla1 = mysql_query("SELECT * FROM gallery WHERE id_cat=1"); 
$blabla2 = mysql_query("SELECT * FROM gallery WHERE id_cat=2"); 
$blabla3 = mysql_query("SELECT * FROM gallery WHERE id_cat=3"); 

तो, क्या मुझे सुरक्षा के लिए कुछ भी करने की ज़रूरत है? एसक्यूएल इंजेक्शन या कुछ और की तरह। यूआरएल जाने के लिए कुछ भी नहीं है। यह सिर्फ www.blabla.com/gallery.php है।

उत्तर

10

यह स्निपेट पूरी तरह से सुरक्षित है, क्योंकि क्वेरी स्ट्रिंग में कोई चर नहीं है।

यदि आपको एक दिन चर के साथ सौदा करना है, तो सुरक्षित रूप से काम करने के लिए - यदि वे सीधे उपयोगकर्ता से या किसी अन्य डेटा स्रोत से आते हैं - तो आप एक mySQL लाइब्रेरी पर स्विच करना चाहेंगे जो parametrized क्वेरी का समर्थन करता है, जैसे PDO । जो इंजेक्शन के खतरे को पूरी तरह से खत्म करते हैं, क्योंकि वे आने वाले डेटा से बचने का ख्याल रखते हैं।

आप mysql_* कार्यों के साथ चिपके रहते हैं, तो आप का उपयोग कर mysql_real_escape_string()और सुनिश्चित करें कि वे एकल उद्धरण की एक जोड़ी के भीतर डाला जाता है सभी आने वाली किसी भी डेटा से बचने सुनिश्चित करें।

+1

आप बार-बार एक ही त्रुटि दोहराना जारी रखते हैं। आने वाले डेटा नहीं बल्कि किसी भी डेटा। –

+1

@ कोल आप सही हैं। सही किया। –

+1

कोई डेटा नहीं बल्कि केवल डेटा जो उद्धरणों में संलग्न होगा :) यह सरल नियम है लेकिन हर कोई इसके कुछ हिस्से को भूल रहा है। यही कारण है कि parametrized प्रश्नों के बिना शर्त उपयोग बेहतर अभ्यास माना जाता है। पीओडी और तैयार प्रश्नों के लिए –

4

जब तक आपके प्रश्न पैरामीटर का उपयोग नहीं करते हैं, SQL इंजेक्शन जोखिम नहीं है। एसक्यूएल इंजेक्शन केवल तभी हो सकता है जब उपयोगकर्ता (या अन्य स्रोत) SQL में डेटाबेस को भेजे जाने वाले किसी भी चीज़ को प्रभावित कर सकें, उदाहरण के लिए खोजशब्द

+0

असल में SQL इंजेक्शन तभी हो सकता है जब ** प्रोग्रामर ** सरल वाक्यविन्यास नियमों का पालन करने में विफल रहता है।और एसक्यूएल इंजेक्शन के पास उपयोगकर्ता इनपुट –

+5

के साथ कुछ लेना देना नहीं है आप उपयोगकर्ता इनपुट के बिना एक एसक्यूएल इंजेक्शन कैसे करेंगे? –

+0

@ कोल। Schrapnel: किसी डेवलपर को किसी क्वेरी में इसका उपयोग करने से पहले हमेशा किसी भी पैरामीटर को सैनिटाइज करना चाहिए। यह सच है कि डेटा किसी अन्य स्रोत से भी आ सकता है (उदाहरण के लिए हार्ड डिस्क पर एक फ़ाइल) – Jasper

2

यहां कोई सुरक्षा समस्या नहीं है। एसक्यूएल इंजेक्शन हो सकता है जहां आप उपयोगकर्ता से इनपुट प्राप्त करते हैं और इसे अपने प्रश्नों में उपयोग करते हैं।

1

यह स्निपेट सुरक्षित है, क्योंकि कोई उपयोगकर्ता क्वेरी में इनपुट प्रदान नहीं करता है।

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

2

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

0

केवल एक चीज है कि आप पर विचार करना, यह सोचते हैं कि कनेक्शन कोड वेब पर पहुँच PHP स्क्रिप्ट में है चाहते हो सकता है, है करने के लिए या तो:

  1. कदम स्क्रिप्ट से बाहर और में MySQL कनेक्शन साइट के दस्तावेज़ रूट के बाहर एक फ़ाइल

  2. या, का उपयोग बाहरी रूप से sourced चर (यानी दस्तावेज़ जड़ की बाहर एक अलग फ़ाइल से) यूज़रनेम और पासवर्ड 01 के स्थान पर के लिए स्क्रिप्ट

इस तरह अगर, किसी भी कारण सर्वर कोड के बजाय प्रदर्शित करता है पीएचपी प्रतिपादन के मेंहार्ड-कोडेड विवरण, तो विवरण देखने से सुरक्षित रहेंगे

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