डायनामिक एसक्यूएल का उपयोग करके आप इसे पूरा कर सकते हैं (यदि मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं)।
चाल यह है कि आपको SQL कथन वाली एक स्ट्रिंग बनाने की आवश्यकता है। ऐसा इसलिए है क्योंकि जब आप कथन निष्पादित करते हैं, तो टैबलेटनाम को वास्तविक SQL पाठ में निर्दिष्ट करना होता है। तालिका संदर्भ और स्तंभ संदर्भों को पैरामीटर के रूप में आपूर्ति नहीं की जा सकती, जिन्हें SQL पाठ में प्रदर्शित होना है।
तो आप कुछ इस तरह के दृष्टिकोण का उपयोग कर सकते हैं:
SET @stmt = 'INSERT INTO @tmpTbl1 SELECT ' + @KeyValue
+ ' AS fld1 FROM tbl' + @KeyValue
EXEC (@stmt)
सबसे पहले, हम एक स्ट्रिंग के रूप में एक SQL स्टेटमेंट बनाते हैं। 'फू' के @KeyValue को देखते हुए, जो एक स्ट्रिंग बनाएगा जिसमें:
'INSERT INTO @tmpTbl1 SELECT Foo AS fld1 FROM tblFoo'
इस बिंदु पर, यह सिर्फ एक स्ट्रिंग है। लेकिन हम EXECUTE
. का उपयोग करके, एक गतिशील SQL कथन के रूप में स्ट्रिंग की सामग्री को निष्पादित कर सकते हैं (या EXEC
छोटे के लिए)।
पुराना स्कूल sp_executesql
प्रक्रिया EXEC का एक विकल्प है, डायनामिक SQL को निष्पादित करने का एक और तरीका है, जो आपको स्टेटमेंट के टेक्स्ट में सभी मानों को शाब्दिक के रूप में निर्दिष्ट करने के बजाय पैरामीटर पास करने की अनुमति देता है।
अनुसरण करें
EBarr बताते हैं (सही और महत्वपूर्ण रूप से) कि यह दृष्टिकोण SQL इंजेक्शन के लिए अतिसंवेदनशील है।
विचार करें कि क्या होगा यदि @KeyValue
स्ट्रिंग शामिल है:
'1 AS foo; DROP TABLE students; -- '
एक SQL कथन के रूप में हम जो स्ट्रिंग उत्पन्न करेंगे वह होगा:
'INSERT INTO @tmpTbl1 SELECT 1 AS foo; DROP TABLE students; -- AS fld1 ...'
जब हम उस स्ट्रिंग को SQL कथन के रूप में निष्पादित करते हैं:
INSERT INTO @tmpTbl1 SELECT 1 AS foo;
DROP TABLE students;
-- AS fld1 FROM tbl1 AS foo; DROP ...
और यह सिर्फ एक ड्रॉप टेबल नहीं है जिसे इंजेक्ट किया जा सकता है। किसी भी SQL को इंजेक्ट किया जा सकता है, और यह बहुत अधिक सूक्ष्म और इससे भी अधिक नापाक हो सकता है। (पहले हमलों में टेबल और कॉलम के बारे में जानकारी प्राप्त करने का प्रयास किया जा सकता है, इसके बाद डेटा (ईमेल पते, खाता संख्या, आदि) को पुनः प्राप्त करने का प्रयास किया जा सकता है।
इस भेद्यता को संबोधित करने का एक तरीका है @KeyValue की सामग्री को मान्य करना, मान लें कि इसमें केवल वर्णमाला और संख्यात्मक वर्ण होने चाहिए (उदाहरण के लिए LIKE '%[^A-Za-z0-9]%'
. यदि कोई अवैध चरित्र पाया जाता है, तो मान को अस्वीकार करें, और बिना किसी SQL को निष्पादित किए बाहर निकलें।