अपने SQL में "स्ट्रिंग इंजेक्शन" का उपयोग न करें, केवल उन मामलों को छोड़कर जहां यह वास्तव में अपरिहार्य है, जैसे कि str(DEPT)
यहां यह चुनने के लिए कि आप किस तालिका से चयन कर रहे हैं। हर दूसरे मामले के लिए, इसके बजाय पायथन डीबी एपीआई की पैरामीटर पासिंग सुविधा का उपयोग करें - यह आपके लिए चीजों को ठीक से उद्धृत करेगा और अन्य चीजों के साथ स्वचालित रूप से "एसक्यूएल इंजेक्शन" हमलों के खिलाफ आपका बचाव करेगा। (यह कभी-कभी तेज भी हो सकता है)।
चूंकि MySQLdb दुर्भाग्यपूर्ण संकेतन का उपयोग करता है %s
मापदंडों के लिए, यहां आपको क्या करना चाहिए (पीईपी 8-अनुपालन के लिए शैली को ठीक करना, आवश्यक नहीं है लेकिन चोट नहीं पहुंचा सकता;-):
conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))
%%
s स्ट्रिंग स्वरूपण में जो q
. उत्पन्न करता है सिंगल बनें %
प्रत्येक स्वरूपण पर, इसलिए q
%s
. की दो घटनाओं के साथ बचा है -- जिसे execute
CLASS
. के सही स्वरूपित संस्करणों के साथ बड़े करीने से भरता है और SEC
. सभी str
कॉल बेमानी हैं, आदि।
एक तरफ, यदि आप Python 2.6 या बाद के संस्करण पर हैं, तो स्ट्रिंग स्वरूपण के लिए आपको नए format
का उपयोग करना चाहिए पुराने %
. के बजाय विधि ऑपरेटर - जो आपको अन्य लाभों के साथ उन "डबल अप% साइन्स" की आवश्यकता से बचाता है। मैंने उपरोक्त स्निपेट में उस परिवर्तन को लागू नहीं किया है, यदि आप 2.5 या इससे पहले के संस्करण के साथ फंस गए हैं (इसलिए उपरोक्त कोड केवल हाल ही में पायथन के किसी भी संस्करण में काम करता है)।