आप प्रत्येक को पैरामीटर कर सकते हैं मान, तो कुछ इस तरह:
string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})";
string[] paramNames = tags.Select(
(s, i) => "@tag" + i.ToString()
).ToArray();
string inClause = string.Join(", ", paramNames);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
for(int i = 0; i < paramNames.Length; i++) {
cmd.Parameters.AddWithValue(paramNames[i], tags[i]);
}
}
जो आपको देगा:
cmd.CommandText = "SELECT * FROM Tags WHERE Name IN (@tag0, @tag1, @tag2, @tag3)"
cmd.Parameters["@tag0"] = "ruby"
cmd.Parameters["@tag1"] = "rails"
cmd.Parameters["@tag2"] = "scruffy"
cmd.Parameters["@tag3"] = "rubyonrails"
नहीं, यह SQL इंजेक्शन के लिए खुला नहीं है। कमांडटेक्स्ट में एकमात्र इंजेक्शन वाला टेक्स्ट उपयोगकर्ता इनपुट पर आधारित नहीं है। यह पूरी तरह से हार्डकोडेड "@tag" उपसर्ग और एक सरणी की अनुक्रमणिका पर आधारित है। अनुक्रमणिका हमेशा होगी एक पूर्णांक हो, उपयोगकर्ता द्वारा उत्पन्न नहीं है, और सुरक्षित है।
उपयोगकर्ता द्वारा इनपुट किए गए मान अभी भी मापदंडों में भरे हुए हैं, इसलिए वहां कोई भेद्यता नहीं है।
संपादित करें:
<ब्लॉकक्वॉट>इंजेक्शन की चिंता एक तरफ है, इस बात पर ध्यान दें कि मापदंडों की एक चर संख्या (ऊपर के रूप में) को समायोजित करने के लिए कमांड टेक्स्ट का निर्माण कैश्ड प्रश्नों का लाभ उठाने के लिए SQL सर्वर की क्षमता को बाधित करता है। शुद्ध परिणाम यह है कि आप लगभग निश्चित रूप से पहली जगह में पैरामीटर का उपयोग करने का मूल्य खो देते हैं (जैसा कि केवल एसक्यूएल में अनुमानित स्ट्रिंग डालने के विपरीत)।
ऐसा नहीं है कि कैश्ड क्वेरी प्लान मूल्यवान नहीं हैं, लेकिन IMO यह क्वेरी लगभग इतनी जटिल नहीं है कि इससे अधिक लाभ देखा जा सके। जबकि संकलन लागत निष्पादन लागत तक पहुंच सकती है (या उससे भी अधिक), आप अभी भी मिलीसेकंड की बात कर रहे हैं।
यदि आपके पास पर्याप्त RAM है, तो मैं अपेक्षा करता हूं कि SQL सर्वर शायद पैरामीटर की सामान्य गणना के लिए भी एक योजना को कैश करेगा। मुझे लगता है कि आप हमेशा पांच पैरामीटर जोड़ सकते हैं, और अनिर्दिष्ट टैग को न्यूल होने दें - क्वेरी प्लान समान होना चाहिए, लेकिन यह मेरे लिए बहुत बदसूरत लगता है और मुझे यकीन नहीं है कि यह माइक्रो-ऑप्टिमाइज़ेशन के लायक होगा (हालांकि, स्टैक ओवरफ़्लो पर - यह बहुत अच्छी तरह से इसके लायक हो सकता है)।
साथ ही, SQL सर्वर 7 और बाद के संस्करण प्रश्नों को स्वतः-पैरामीटर कर देंगे, इसलिए पैरामीटर का उपयोग करना वास्तव में प्रदर्शन के दृष्टिकोण से आवश्यक नहीं है - हालांकि, यह महत्वपूर्ण है सुरक्षा के दृष्टिकोण से - विशेष रूप से इस तरह से उपयोगकर्ता द्वारा इनपुट किए गए डेटा के साथ।