2011-01-07 10 views
5

मैं पीडीओ पुस्तकालयों के साथ नौसिखिया हूँ। मैं अपने डेटाबेस के रूप में mysql के साथ विकास पर्यावरण पर काम कर रहा हूं। मैं "?" का उपयोग करते समय तैयार और निष्पादित फ़ंक्शन का उपयोग करके अपने प्रश्नों को चलाने में सक्षम हूं प्लेसहोल्डर और नामित प्लेसहोल्डर्स का उपयोग करते समय बाइंड पैराम विधि (उदा: ": कॉलम")।हम कैसे जानते हैं कि पीडीओ एसक्यूएल इंजेक्शन से बच रहा है?

इसके बाद मैंने यह देखने की कोशिश की कि क्या पीडीओ mysql_real_escape_string करता है जैसे क्वेरी को स्वच्छ करने के लिए किसी भी उद्धरण को डालकर किसी भी तरह से बच निकलता है। मैं यह देखने की कोशिश कर रहा हूं कि क्वेरी क्या दिखाई देगी लेकिन मुझे जो भी मिलता है वह वह बयान है जिसे तैयार कथन में पारित किया गया है, लेकिन वह क्वेरी नहीं जिसे निष्पादित किया जाएगा।

मैंने $ result-> निष्पादन(), और $ परिणाम-> fetch() को var_dump करने की कोशिश की लेकिन निष्पादन कथन मुझे मेरे धारक के साथ मेरे तैयार कथन का एसक्यूएल देता है जबकि fetch स्टेटमेंट मुझे उस क्वेरी का परिणाम देता है।

क्या खोज क्वेरी को देखने का कोई तरीका है, या कम से कम क्वेरी चलाने से पहले पैरामीटर कैसे दिखेंगे ??

मुझे आशा है कि मैं अपने प्रश्न के साथ स्पष्ट कर रहा हूँ। : |

+1

आप बहुत ज्यादा चिंता। तैयार बयान 100% पर आपके इनपुट से बचें। यदि आपको यह देखने की ज़रूरत है कि अंतिम क्वेरी कैसा दिखता है, तो आपको डेटाबेस क्वेरी लॉग सेट करना होगा। – netcoder

+1

@netcoder तैयार कथन कुछ भी नहीं बचते हैं (जब तक संगत मोड में नहीं)। और क्वेरी लॉग –

+0

@Col में कुछ भी नया नहीं है। Shrapnel: ठीक है तकनीकी रूप से हाँ यह करता है, हालांकि आप इसे जिस तरह से चाहते हैं शब्द कर सकते हैं। जैसा कि "क्वेरी लॉग में कुछ भी नया नहीं है", मुझे बस समझ में नहीं आता कि इसका क्या अर्थ है ... – netcoder

उत्तर

6

अनुरोध भेजें:

$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;'); 
$stmt->bindValue('col_name', 'some \' value'); 
$stmt->execute(); 

वास्तविक क्वेरी है ... SELECT * FROM tbl_name WHERE col_name = :col_name;। इसे तैयार कथन कहा जाता है। सबसे पहले, आप डेटाबेस को क्वेरी भेजते हैं, बाद में आप क्वेरी पैरामीटर भेजते हैं। पीडीओ क्वेरी और पैरामीटर मर्ज नहीं करता है।

आप शायद सोचा है कि PDOStatement::bindValue() की तरह कुछ करता है:

public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) { 
    $this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query); 
} 

लेकिन यह नहीं करता है। - कुछ आवेषण कर

public function execute() { 
    try { 
     $this->sendQueryToDatabase($this->query); 

     // Query is valid 
     $this->sendParametersToDatabase($this->parameters); 

     return $this->fetchResultSet(); 
    } catch (... $e) { 
     // Query is invalid (eg. syntax error) 
     throw ...; 
    } 
} 

Read more about Prepared Statements

+0

तो हम कैसे जानेंगे कि भेजे गए पैरामीटर सुरक्षित हैं या नहीं ?? क्या हमें हाथ से पहले जांचना है ??? – macha

+2

पैरामीटर असुरक्षित नहीं हो सकते क्योंकि वे क्वेरी का हिस्सा नहीं हैं। वे सिर्फ एक कच्चे डेटा हैं। – Crozin

+0

हे मुझे पता है कि यह थोड़ा अधिक स्तर हो सकता है, क्या आपको कोई विचार है कि क्वेरी को कैसे पार्स किया जाएगा और फिर इन पैरामीटर को प्लेसहोल्डर्स के साथ कैसे भेजा/प्रतिस्थापित किया जाएगा? – macha

1

बयान तैयार mysql से संभाल नहीं है, इसलिए पीडीओ अनुरोध से बच नहीं है, पीडीओ जब आप की तरह कुछ लिखने "के बाद" पैरामीटर

+0

पता नहीं क्यों आप नीचे उतर रहे हैं, यह वास्तव में सच है। – netcoder

+0

यह वास्तव में सच नहीं है, पीडीओ आमतौर पर तैयार वक्तव्यों को अनुकरण करता है, सर्वर-साइड तैयार कथन के रूप में, समर्थित होने पर, आम तौर पर एक अच्छा विचार नहीं होता है। – MarkR

+0

@MarkR केवल संगतता मोड में जो पहले से अप्रचलित है –

-1

सामान्य क्वेरी लॉग सक्षम करें, और प्रश्नों वास्तव में सर्वर जब आप सरल बयान चला रहे हैं के खिलाफ निष्पादित किया जा रहा देखने के लिए:

इसे और अधिक ऐसा ही कुछ होता है , उदाहरण के लिए, एम्बेडेड कोट्स या नल्स युक्त तारों के साथ।

+0

वह कुछ भी नया नहीं देख पाएगा –

3

इसे सीधे रखने के लिए।

  1. मूल निवासी मोड:

    पीडीओ तैयार बयान चलाने का 2 मोड हैं। डेटाबेस से-pa-ra-te-ly पर क्वेरी और डेटा भेजा जा रहा है। जिसका अर्थ है कि डेटा कभी भी क्वेरी में जोड़ा जा रहा है। तो, कोई नुकसान नहीं किया जा सका। कभी। ? अंकों के साथ डेटाबेस को भेजी जाने वाली क्वेरी (लेकिन नामित प्लेसहोल्डर जिन्हें पीडीओ द्वारा ? एस के साथ प्रतिस्थापित किया जा रहा है)

  2. संगतता मोड। पीडीओ बाध्य चर के साथ प्लेसहोल्डर्स को प्रतिस्थापित करके पुरानी शैली की क्वेरी बनाते हैं वेरिएबल नाम पर निर्भर करता है। स्ट्रिंग्स को उद्धृत/भाग लिया जा रहा है, बाकी को इसके प्रकार के लिए डाला जा रहा है।

दोनों विधियां पूरी तरह से सुरक्षित हैं।

असली खतरा शुरू होता है आप एक चर पहचानकर्ता है जब ...

+0

वैरिएबल पहचानकर्ता खतरनाक क्यों है ?? मैंने सोचा कि यह अधिक सुरक्षित था क्योंकि हम डेटा प्रकार को भी सत्यापित करते हैं? – macha

+0

@ माचा मेरा मतलब फ़ील्ड का नाम है। उदाहरण के लिए 'कॉलम_नाम' से तालिका ऑर्डर से' चुनें * वास्तव में खतरनाक है –

+0

ठीक है !! प्रतिक्रिया के लिए धन्यवाद। – macha

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