2010-01-19 10 views
13

मैं अजगर के db-api का उपयोग करके निम्न SQL विवरण इकट्ठा करने के लिए कोशिश कर रहा हूँ का उपयोग कर एक एसक्यूएल की तरह बयान उत्पन्न करने के लिए:कैसे सुरक्षित रूप से अजगर db-api

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%'; 

एक अजगर वर सुरक्षित रूप में भरे जाने वाले जहां BEGINNING_OF_STRING किया जाना चाहिए डीबी-एपीआई के माध्यम से। मैंने

beginningOfString = 'abc' 

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString) 

मैं विचारों से बाहर हूं; ऐसा करने का सही तरीका क्या है?

उत्तर

20

यह एसक्यूएल से पैरामीटर अलग करने के लिए करता है, तो आप कर सकते हैं सबसे अच्छा है। फिर आप डीबी मॉड्यूल को पैरामीटर के उचित उद्धरण की देखभाल करने दे सकते हैं। Sqlite3 दस्तावेज की

sql='SELECT x FROM myTable WHERE x LIKE %s' 
args=[beginningOfString+'%'] 
cursor.execute(sql,args) 
+0

@ ~ unutbu: धन्यवाद, यह नाखून है। डीबी-एपीआई के माध्यम से एक तर्क के रूप में इसे पास करने से पहले * स्ट्रिंग में% को जोड़ने के लिए मेरे दिमाग को पार नहीं किया था। – laramichaels

2

संपादित करें:

ब्रायन और थॉमस बताया गया है, दूर बेहतर यह करने के लिए उपयोग करने के लिए किया जाएगा जिस तरह से:

beginningOfString += '%' 
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,)) 

पहली विधि के बाद से छोड़ देता है आप एसक्यूएल इंजेक्शन हमलों के लिए खुला ।


इतिहास के लिए में वाम:

प्रयास करें:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString) 
+3

-1 '" मेराटेबल से एक्स चुनें, जैसे '% s %%' "%" डूम '; ड्रॉप टेबल एक्स;' '' ** 'ओओएस? ** – Brian

+0

@ ब्रायन; बहुत मान्य बिंदु! मैं वाक्यविन्यास त्रुटि पर ध्यान केंद्रित कर रहा था; मुझे यह नहीं माना जाना चाहिए था कि 'शुरुआत' साफ डेटा था। पकड़ने के लिए धन्यवाद! –

+0

-1 हटा दिया गया। हालांकि, आपके पास अभी भी एक वाक्यविन्यास त्रुटि है। अपनी स्ट्रिंग के लिए डबल कोट्स का उपयोग करें और आपको अपने सिंगल कोट्स से बचने की आवश्यकता नहीं होगी। – Brian

-1

ध्यान दें:

आमतौर पर अपने एसक्यूएल संचालन की आवश्यकता होगी अजगर चर से मानों का उपयोग कर। आपको पाइथन के स्ट्रिंग ऑपरेशंस का उपयोग करके अपनी क्वेरी एकत्र नहीं करना चाहिए क्योंकि ऐसा करना असुरक्षित है; यह आपके प्रोग्राम को SQL इंजेक्शन हमले के लिए कमजोर बनाता है।

इसके बजाय, डीबी-एपीआई पैरामीटर प्रतिस्थापन का उपयोग करें। डाल ? एक प्लेसहोल्डर जहां भी आप किसी मान का उपयोग करना चाहते हैं, और तो कर्सर की निष्पादित() विधि के लिए दूसरी तर्क के रूप में मानों का एक tuple प्रदान करें। उदाहरण के लिए: (1 अन्य डेटाबेस मॉड्यूल ऐसे% s या के रूप में, एक अलग प्लेसहोल्डर का उपयोग कर सकते हैं।):

# Never do this -- insecure! 
symbol = 'IBM' 
c.execute("... where symbol = '%s'" % symbol) 

# Do this instead 
t = (symbol,) 
c.execute('select * from stocks where symbol=?', t) 

# Larger example 
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), 
      ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), 
      ('2006-04-06', 'SELL', 'IBM', 500, 53.00), 
     ]: 
    c.execute('insert into stocks values (?,?,?,?,?)', t) 

मुझे लगता है कि आप इस हैं:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,)) 
+0

नहीं, यह गलत बात करेगा। –

+0

@ थॉमस: क्यों? इस तथ्य के अलावा कि मैंने ''% '%' '' '%' 'के बजाय'%?% ''का उपयोग किया था (वह अपनी क्वेरी में पूरी तरह से संगत नहीं था), मुझे कोई समस्या नहीं दिख रही है। – Brian

+5

समस्या यह है कि? आपके द्वारा पारित वास्तविक तर्क के * उद्धृत * संस्करण द्वारा प्रतिस्थापित किया जाता है। इसलिए दिया गया है, उदाहरण के लिए "'; ड्रोप टेबल एक्स; चयन करें'" (एकल * और * डबल कोट्स को नोटिस करें), आप इस स्पष्ट रूप से खराब क्वेरी के साथ समाप्त होते हैं: MyTable से x का चयन करें x जैसे '%'; ड्रॉप टेबल x ; '%' –

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