2012-01-16 11 views
7

पीएचपी प्रलेखन पीडीओ के अनुसार :: तैयार() अपने सभी मापदंडों को उद्धरण कहते हैं ताकि आप इसे करने के बारे में चिंता करने की ज़रूरत नहीं है:पीडीओ से जोड़ा उद्धरण के साथ काम :: तैयार()

"तैयार बयानों के पैरामीटर को उद्धृत करने की आवश्यकता नहीं है; चालक स्वचालित रूप से इसे संभालता है। यदि कोई एप्लिकेशन विशेष रूप से तैयार कथन का उपयोग करता है, तो डेवलपर यह सुनिश्चित कर सकता है कि कोई SQL इंजेक्शन नहीं होगा (हालांकि, यदि क्वेरी के अन्य भाग हैं अनचाहे इनपुट के साथ बनाया गया, एसक्यूएल इंजेक्शन अभी भी संभव है)। "

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

SELECT * FROM ? WHERE ?=? 

रूप tablename से करने के लिए चुनें * का विरोध कहां? =?

तो मेरा सवाल यह है कि, क्या मेरे पीडीओ ऑब्जेक्ट को पैरामीटर पैरामीटर के चारों ओर उद्धरण जोड़ने से रोकना संभव है ताकि मुझे मेरे चेहरे में एसक्यूएल त्रुटियां नहीं मिलें? या मुझे इसे अलग तरीके से करना है।

+2

वास्तव में सवाल क्या है? – jeroen

+0

यह जरूरी नहीं है उद्धरण जोड़ें। मूल तैयार कथन का समर्थन करने वाले ड्राइवर्स शाब्दिक '?' बनाए रखेंगे और डेटाबेस सर्वर प्रतिस्थापन करता है। - हालांकि आपको यह बताने की ज़रूरत है कि आपका कोड क्या विशेष रूप से कर रहा है और यह यहां एक समस्या क्यों है। अपने FROM खंडों में ''?'' या ''प्लेसहोल्डर' जोड़ना शाब्दिक तार हैं, बाध्य पैरामीटर नहीं। – mario

+0

इसके बारे में क्षमा करें, मैंने – hamalnamal

उत्तर

4

तैयार बयानों में प्लेसहोल्डर केवल मूल्यों के लिए हैं। डायनामिक टेबल नामों को सम्मिलित करने का एकमात्र तरीका यह है कि आप इसे

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

और निश्चित रूप से बैक टिक के साथ मूल्य को लपेटना सुरक्षित नहीं है यदि चर सामग्री एक दंडित स्रोत से आई है। – Matthew

+0

@YourCommonSense क्या आप मुझे एक उपयोग-केस दे सकते हैं, जहां _table_ और _column_ नाम आपके नियंत्रण से बाहर स्रोत से आते हैं? जब वे उपयोगकर्ता इनपुट पर _omeome_ आधार करते हैं तो उन्हें केवल अपना डीबी पासवर्ड देना बहुत आसान होता है। यह कहा गया है कि आप या तो मान सकते हैं कि वे एक विश्वसनीय स्रोत (उदाहरण के लिए कॉन्फ़िगरेशन, या कहीं और हार्डकोडेड) से आते हैं, या आपने कुछ गलत किया है। और यह अभी भी आपको अपने दिमाग का उपयोग करने से नहीं रोकता है :) – KingCrunch

+0

सस्ता बात, दोस्त। –

2

@ किंग कंचन अपने उत्तर में अधिकतर सही है। आपको वास्तव में स्ट्रिंग से बच जाना चाहिए। इस तरह से कुछ इंजेक्शन के खिलाफ सुरक्षा करनी चाहिए:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?" 
संबंधित मुद्दे