2012-06-08 6 views
6

में एसक्यूएल इंजेक्शन के खिलाफ सुरक्षा मेरे पास पाइथन में कुछ कोड है जो एक एसक्लाइट डीबी में एक char (80) मान सेट करता है।पायथन

स्ट्रिंग सीधे उपयोगकर्ता से टेक्स्ट इनपुट फ़ील्ड के माध्यम से प्राप्त की जाती है और JSON संरचना में POST विधि के साथ सर्वर पर वापस भेज दी जाती है।

सर्वर की तरफ मैं वर्तमान में एसक्यूएल अद्यतन ऑपरेशन को कॉल करने वाली विधि को स्ट्रिंग पास करता हूं।

यह काम करता है, लेकिन मुझे पता है कि यह बिल्कुल सुरक्षित नहीं है।

मुझे उम्मीद है कि क्लाइंट पक्ष असुरक्षित है, इसलिए किसी भी सुरक्षा को सर्वर की तरफ रखा जाना है। अद्यतन ऑपरेशन को फिर से एसक्यूएल इंजेक्शन को सुरक्षित करने के लिए मैं क्या कर सकता हूं?

एक ऐसा फ़ंक्शन जो पाठ को "उद्धृत" करेगा ताकि वह SQL पार्सर को भ्रमित नहीं कर सके जो मैं ढूंढ रहा हूं। मुझे उम्मीद है कि इस तरह का कार्य मौजूद है लेकिन इसे नहीं मिला।

संपादित करें: यहाँ मेरे वर्तमान कोड चार फ़ील्ड नाम लेबल स्थापित कर रही है:

def setLabel(self, userId, refId, label): 
    self._db.cursor().execute(""" 
     UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", (label, userId, refId)) 
    self._db.commit() 
+0

अजगर समर्थन पैरामिट्रीकृत प्रश्नों करता है नहीं? –

+0

@ जेरेमी। हाँ ... लेकिन यह वास्तव में है कि किसी विशेष डेटाबेस के लिए पायथन लाइब्रेरी इसका समर्थन करती है (जो वे सभी AFAIK करते हैं)। – Gerrat

+0

हां। तो मेरे प्रश्न पर विचार करें क्योंकि मैं यह पूछता हूं कि एसक्यूएल इंजेक्शन के खिलाफ सुरक्षा सुनिश्चित करने के लिए मैं क्या कर रहा हूं। – chmike

उत्तर

7

प्रलेखन से:

con.execute("insert into person(firstname) values (?)", ("Joe",)) 

यह "Joe" निकल जाता है, तो आप क्या चाहते हैं

con.execute("insert into person(firstname) values (?)", (firstname_from_client,)) 
+0

मैंने अपने प्रश्न को वर्तमान में उपयोग किए जाने वाले कोड के साथ अपडेट किया है। जैसा कि आप सुझाव देते हैं मैंने किया। क्या इसका मतलब है कि मेरा कोड एसक्यूएल इंजेक्शन के खिलाफ सुरक्षित है? – chmike

+0

मैं भूल गया कि "भागने" का मतलब एसक्यूएल इंजेक्शन के खिलाफ सुरक्षित है। उदाहरण के कारण मैंने आपको उत्तर दिया। अपना ज्ञान साझा करने और मेरी मदद करने के लिए बहुत बहुत धन्यवाद। – chmike

0

Noooo ... उपयोग BIND चर! यही वह है जिसके लिए वे हैं। this

देखें तकनीक के लिए एक और नाम parameterized sql है (मुझे लगता है कि "बाँध चर" Oracle के साथ विशेष रूप से प्रयोग किया जाता है नाम हो सकता है)।

+0

BIND चर क्या हैं? सुझाव देने के लिए कोई यूआरएल? एक उत्तर जोड़ें – chmike

+0

ज़रूर ... आप कौन सी आरडीबीएमएस का उपयोग कर रहे हैं? – Gerrat

+0

मैं अब के लिए sqlite का उपयोग कर रहा हूँ। यह अभी तक मेरे वेब ऐप का उत्पादन संस्करण नहीं है। – chmike

1

डीबी-एपीआई .execute() पैरामीटर प्रतिस्थापन का समर्थन करता है जो आपके लिए भागने का ख्याल रखेगा, जो दस्तावेज़ों के शीर्ष के निकट है; http://docs.python.org/library/sqlite3.htmlसे ऊपर कभी नहीं करें - असुरक्षित

+0

संदर्भ के लिए धन्यवाद। मुझे अब यह बहुत समय पहले पढ़ना और तब से आवेदन करना याद है। मुझे पता नहीं था कि यह एसक्यूएल इंजेक्शन के खिलाफ मेरी रक्षा कर रहा था। एक दम बढ़िया। मैंने इसे सही तरीके से किया। आपको जवाब देने के लिए खेद है। मार्टिजन के मुकाबले कम अंक हैं और उन्होंने एक उदाहरण दिया जो मेरे जैसे लोगों के लिए इस प्रश्न का उत्तर खोजने के लिए आसान होगा। – chmike