यहां आपके लिए कुछ समाधान दिए गए हैं।
नमूना डेटा:
declare @xml xml
set @xml =
'<EventSpecificData>
<Keyword>
<Word>myWord</Word>
<Occurences>1</Occurences>
<Context>context</Context>
</Keyword>
</EventSpecificData>'
माता-पिता की परवाह किए बिना पद नामित नोड से पहले मान प्राप्त करें। गहरी खोज करने के लिए //
का उपयोग करें और नोड नाम से मेल खाने के लिए local-name()
का उपयोग करें।
declare @Attribute varchar(max)
set @Attribute = 'Word'
select @xml.value('(//*[local-name() = sql:variable("@Attribute")])[1]', 'varchar(max)')
दो स्तरों में local-name()
का उपयोग कर अलग-अलग वैरिएबल में माता पिता के नोड नाम और विशेषता प्रदान करें।
declare @Node varchar(max)
declare @Attribute varchar(max)
set @Attribute = 'Word'
set @Node = 'Keyword'
select @xml.value('(/EventSpecificData
/*[local-name() = sql:variable("@Node")]
/*[local-name() = sql:variable("@Attribute")])[1]', 'varchar(max)')
nodes
को पैरामीटर के बाद से एक स्ट्रिंग शाब्दिक यह इस को हल करने के गतिशील एसक्यूएल उपयोग करने के लिए आमंत्रित किया है रहना होगा। यह आपकी मूल चर सामग्री के साथ काम करने के लिए ऐसा कुछ दिख सकता है।
set @Attribute = 'Keyword/Word'
declare @SQL nvarchar(max)
set @SQL = 'select @xml.value(''(/EventSpecificData/'[email protected]+')[1]'', ''varchar(max)'')'
exec sp_executesql @SQL, N'@xml xml', @xml
लेकिन आपको लगता है कि के बारे में पता होना चाहिए, अगर आप इस का उपयोग आप विस्तृत SQL इंजेक्शन हमलों के लिए खुला है। उस के साथ गतिशील एसक्यूएल निष्पादित आप दो परिणाम सेट दे देंगे
set @Attribute = 'Keyword/Word)[1]'', ''varchar(max)'') select @@version --'
: कुछ कुटिल अंतिम-उपयोगकर्ता एक विशेषता स्ट्रिंग है कि इस तरह दिखता है के साथ आ सकता है। select @@version
कुछ हानिरहित कोड दिखाने के लिए बस है लेकिन यह वहां बहुत खराब चीजें हो सकती है।
आप SQL इंजेक्शन हमले को रोकने के लिए quotename()
का उपयोग कर सकते हैं। यह कम से कम मेरे द्वारा किए गए प्रयास को रोक देगा।
set @Attribute = 'Keyword/Word'
set @SQL = 'select @xml.value('+quotename('(/EventSpecificData/'[email protected]+')[1]', '''')+', ''varchar(max)'')'
exec sp_executesql @SQL, N'@xml xml', @xml
क्या अंतिम संस्करण quotename()
सुरक्षित है? Erland Sommarskog The Curse and Blessings of Dynamic SQL द्वारा इस आलेख पर एक नज़र डालें।
उद्धरण:
quotename() और quotestring() के साथ
तो, हम एसक्यूएल इंजेक्शन की तुलना में अच्छा संरक्षण है के रूप में हम parameterised आदेशों के साथ है? शायद। मैं को एसक्यूएल इंजेक्ट करने के किसी भी तरीके से नहीं जानता जो उद्धरण() या उद्धरण() के माध्यम से फिसल जाता है। फिर भी, आप SQL स्ट्रिंग में उपयोगकर्ता इनपुट को इंटरपोल कर रहे हैं, जबकि पैरामीटरयुक्त आदेशों के साथ, आप नहीं करते हैं।
मुझे नहीं लगता कि आप ऐसा कर सकते हैं - SQL XQuery अक्सर शाब्दिक तारों के साथ काम करता है, और अधिकांश समय, उन्हें SQL चर के साथ प्रतिस्थापित नहीं किया जा सकता .... –