2012-10-11 18 views
6

के रूप में क्वेरी पैरामीटर मैं एक नामित शब्दकोश के रूप में MySQLdb की cursor.execute() विधि के लिए क्वेरी पैरामीटर पास करना चाहते हैं, वे एसक्यूएल इंजेक्शन से बच गए हैं ऐसा है कि।अजगर MySQLdb: एक नामित शब्दकोश

>>>c.execute('select id from users where username=%(user)s', {'user':'bob',}) 
KeyError: 'user' 

MySQLdb मैनुअल http://mysql-python.sourceforge.net/MySQLdb.html का कहना है::

* paramstyle

स्ट्रिंग निरंतर पैरामीटर मार्कर के प्रकार बताते हुए इंटरफ़ेस द्वारा की उम्मीद स्वरूपण

आप क्यों इस KeyError देता है व्याख्या कर सकते हैं। 'प्रारूप' पर सेट करें = एएनएसआई सी printf प्रारूप कोड, उदा। '... कहां नाम =% s'। यदि conn.execute() के लिए मैपिंग ऑब्जेक्ट का उपयोग किया जाता है, तो इंटरफ़ेस वास्तव में 'pyformat' = पायथन विस्तारित प्रारूप कोड का उपयोग करता है, उदा। '... कहां नाम =% (नाम) एस'। हालांकि, एपीआई वर्तमान में paramstyle में एक से अधिक शैली के विनिर्देश की अनुमति नहीं है *

उत्तर

6

दस्तावेज में लाइन निम्नलिखित है कि आप अपने सवाल का जवाब कर सकते हैं चिपकाया:।

Parameter placeholders can only be used to insert column values. They can not be used for other parts of SQL, such as table names, statements, etc.

+0

मैं *** कॉलम मान *** डाल रहा हूं। दस्तावेज़ीकरण में रेखा का अर्थ है कि निम्नलिखित कोड अवैध है: 'c.execute ('% s से आईडी चुनें जहां उपयोगकर्ता नाम =% s', ('उपयोगकर्ता', 'बॉब'))' – mercador

+1

@mercador दाएं, '% s' टुकड़ा से विफलता उत्पन्न हो रही है क्योंकि आप तालिका नाम को पैरामीटर करने का प्रयास कर रहे हैं। इस तरह से 'निष्पादन' का उपयोग करने का लाभ यह है कि यह एसक्यूएल इंजेक्शन को रोकने में मदद करता है, लेकिन यदि आप उचित सुरक्षा सावधानी बरतते हैं (जो कि मैं एक विशेषज्ञ नहीं हूं, लेकिन इसमें उचित स्वच्छता/पैरामीटर से बचने में शामिल होगा), तो आप कर सकते हैं क्वेरी बनाने के लिए स्ट्रिंग स्वरूपण में पाइथन का निर्माण करें और फिर इसे 'निष्पादित करें' पर पास करें। फिर, एसक्यूएल इंजेक्शन मुख्य चिंता है। उम्मीद है की यह मदद करेगा! – RocketDonkey

5

MySQLdb क्वेरी पैरामीटर के रूप में dicts की अनुमति देता है । This response इसे करने के सभी अलग-अलग तरीकों से पता चलता है। आपको केवल "पैरामीटर" के लिए दूसरे पैरामीटर के रूप में इस तरह के पैरामीटर (tuple, dict ...) के रूप में एक सिक्योरेंस प्रदान करने की आवश्यकता है। अपनी क्वेरी को "निष्पादित करें" विधि में केवल एक पैरामीटर के रूप में प्रारूपित न करें या आप संभवतः एसक्यूएल इंजेक्शन हमलों के संपर्क में आ जाएंगे। देखें:

user = "peter;DROP TABLE users" :_(

के रूप में यह आवश्यक जाँच को संभालने के लिए MySQLdb पुस्तकालय की सुविधा देता है दूसरी तरह सुरक्षित है:

"SELECT * FROM users WHERE username = '%s'" % (user) 

लगता है कि अगर क्या होगा।

मैं नहीं जानता, क्या गलत है क्योंकि आपकी क्वेरी मेरे लिए ठीक काम करता है:

# Connect to db 
# Open a cursor 
stmt = "SELECT * FROM users WHERE username = %(user)s" 
cursor.execute(stmt, {"user": "bob"}) 
user = cursor.fetchone() 
print user 

{'username': 'bob', 'alias': 'bobby', 'avatar': 'default', 'fullname': 'bob'} 

आप हमें और अधिक जानकारी दे सकते हैं?

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