आप पायथन स्ट्रिंग स्वरूपण का उपयोग कर रहे हैं और यह एक बहुत बुरा विचार (टीएम) है। एसक्यूएल-इंजेक्शन सोचो। इसे करने का सही तरीका बाध्य चरों का उपयोग करना है:
cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
जहां पैरामीटर के टपल को दूसरे तर्क के रूप में दिया जाता है execute()
. इसके अलावा आपको किसी भी मूल्य से बचने की जरूरत नहीं है, psycopg2 आपके लिए भागने का काम करेगा। इस विशेष मामले में तालिका नाम को एक चर (escaped_name
में पास न करने का भी सुझाव दिया गया है। ) लेकिन इसे क्वेरी स्ट्रिंग में एम्बेड करने के लिए:psycopg2 नहीं जानता कि तालिका और कॉलम नामों को कैसे उद्धृत किया जाए, केवल मान।
psycopg2 दस्तावेज़ देखें:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
यदि आप SQL स्टेटमेंट को प्रोग्रामेटिक रूप से जेनरेट करना चाहते हैं, तो प्रथागत तरीका स्टेटमेंट के लिए पायथन फॉर्मेटिंग और तर्कों के लिए वेरिएबल बाइंडिंग का उपयोग करना है। उदाहरण के लिए, यदि आपके पास escaped_name
. में तालिका का नाम है आप यह कर सकते हैं:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
जाहिर है, अपनी क्वेरी में प्लेसहोल्डर्स का उपयोग करने के लिए आपको किसी भी %
. को उद्धृत करना होगा जो पहले प्रारूप में एक बाध्य तर्क पेश करता है।
ध्यान दें कि यह सुरक्षित है अगर और केवल अगर escaped_name
आपके कोड द्वारा किसी बाहरी इनपुट (उदाहरण के लिए एक टेबल बेस नाम और एक काउंटर) को अनदेखा करते हुए उत्पन्न होता है, लेकिन यदि आप उपयोगकर्ता द्वारा प्रदान किए गए डेटा का उपयोग करते हैं तो यह SQL इंजेक्शन के जोखिम में है।