सही। हम पहचानकर्ताओं को बाइंड पैरामीटर के रूप में आपूर्ति नहीं कर सकते हैं। कॉलम का नाम SQL टेक्स्ट का हिस्सा होना चाहिए।
हम गतिशील रूप से कॉलम के नाम को SQL टेक्स्ट में कुछ इस तरह से शामिल कर सकते हैं:
sql = "UPDATE diseaseinfo"
+ " SET `" + colname + "` = ?"
+ " WHERE companyname = 'mycom' AND diseaseName = ?";
और दो शेष बाइंड मापदंडों के लिए मूल्यों की आपूर्ति करें
preparedStmt.setString(1, attrData);
preparedStmt.setString(2, medname);
और आप SQL इंजेक्शन के बारे में चिंतित होने के बारे में बिल्कुल सही हैं।
attrData
. के मानों में बाइंड वैल्यू, सिंगल कोट्स के रूप में आपूर्ति की जाती है और medname
SQL इंजेक्शन के संदर्भ में कोई समस्या नहीं होगी।
लेकिन मैंने जो उदाहरण दिया है वह है colname
. को शामिल करके असुरक्षित SQL पाठ में परिवर्तनशील, यदि हमारे पास कुछ गारंटी नहीं है कि colname
कथन में शामिल करने के लिए "सुरक्षित" है।
इसलिए हमें colname
. को एक मान का असाइनमेंट बनाना होगा "सुरक्षित"।
ऐसा करने के लिए हम कई तरीकों का इस्तेमाल कर सकते हैं। सबसे सुरक्षित एक "श्वेतसूची" दृष्टिकोण होगा। कोड यह सुनिश्चित कर सकता है कि केवल विशिष्ट अनुमत "सुरक्षित" मान colname
. को असाइन किए जाएं , colname
. से पहले SQL टेक्स्ट में शामिल हो जाता है।
एक साधारण उदाहरण के रूप में:
String colname;
if (attributes.equals("someexpectedvalue") {
colname = "columnname_to_be_used";
} else if (attributes.equals("someothervalid") {
colname = "valid_columname";
} else {
// unexpected/unsupported attributes value so
// handle condition or throw an exception
}
एक अधिक लचीला तरीका यह सुनिश्चित करना है कि colname
. में कोई बैकटिक वर्ण प्रकट न हो . उदाहरण में, colname
. का मान बचाया जा रहा है इसे बैकटिक्स में संलग्न करके। इसलिए, जब तक कोई बैकटिक वर्ण colname
. में प्रकट नहीं होता है , हम आपूर्ति किए गए मान को पहचानकर्ता के अलावा किसी अन्य चीज़ के रूप में व्याख्यायित होने से रोकेंगे।
हार्डकोडेड बैकटिक वर्णों का उपयोग करने के लिए अधिक सामान्य (और जटिल) दृष्टिकोण के लिए, हम supportsQuotedIdentifiers
का उपयोग करने पर विचार कर सकते हैं और getIdentifierQuoteString
java.sql.DatabaseMetaData
. के तरीके कक्षा।
(ओपी कोड में, हम attributes
. की सामग्री का डेटाटाइप नहीं देखते हैं . हम replace
. नामक विधि के लिए एक कॉल देखते हैं , और तर्क जो उस पर दिए गए हैं। मान लें कि attributes
एक स्ट्रिंग है, और इसे एक कॉलम नाम माना जाता है, यह बिल्कुल स्पष्ट नहीं है कि हमारे पास स्ट्रिंग में "स्पेस सिंगल कोट स्पेस" क्यों होगा, या हमें इसे हटाने की आवश्यकता क्यों है। इस उल्लेख के अलावा, यह उत्तर उसे संबोधित नहीं करता है।)