मेरा मानना है कि इस तरह के पैरामीट्रिज्ड स्टेटमेंट का उपयोग मानों . के साथ किया जाना है और तालिका के नाम (या SQL कीवर्ड, आदि) नहीं। तो आप मूल रूप से इसके साथ भाग्य से बाहर हैं।
हालांकि, चिंता न करें, क्योंकि यह तंत्र SQL इंजेक्शन को रोकने के लिए है, और आप सामान्य रूप से जानते हैं कि आप कोड-लेखन के समय किस तालिका तक पहुंचना चाहते हैं, इसलिए इस बात की बहुत कम संभावना है कि कोई व्यक्ति दुर्भावनापूर्ण कोड को इंजेक्ट कर सकता है। बस आगे बढ़ें और तालिका को स्ट्रिंग में लिखें।
यदि, किसी (संभवतः विकृत) कारण से आप तालिका का नाम पैरामीट्रिक इस तरह रखते हैं:
- यदि तालिका का नाम आपके प्रोग्राम से आता है (उदाहरण के लिए एक शब्दकोश, या वर्ग विशेषता), तो सामान्य स्ट्रिंग प्रतिस्थापन करें।
- यदि तालिका का नाम बाहरी दुनिया से आता है ("उपयोगकर्ता इनपुट" सोचें):या तो ऐसा न करें, या उपयोगकर्ता पर पूरी तरह से भरोसा करें और पिछले दृष्टिकोण 1 को लागू करें।
उदाहरण के लिए:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:तीसरे %s को इस समय दूसरे '%s' से बदलने दें, ताकि बाद में psycopg2#2
द्वारा संसाधित किया जा सके :यह वह स्ट्रिंग है जिसे psycopg2 द्वारा ठीक से उद्धृत किया जाएगा और उस तीसरे '%s' के बजाय मूल स्ट्रिंग में रखा जाएगा