मेरा मानना है कि तीन अलग-अलग मामले हैं जिनके बारे में आपको चिंता करने की ज़रूरत है:
- स्ट्रिंग्स (कुछ भी जो उद्धरण की आवश्यकता है):
'''' + replace(@string, '''', '''''') + ''''
- नाम (कुछ भी जहां उद्धरण की अनुमति नहीं है):
quotename(@string)
- ऐसी चीज़ें जिन्हें उद्धृत नहीं किया जा सकता:इसके लिए श्वेतसूची की आवश्यकता है
नोट :सब कुछ एक स्ट्रिंग चर में (char
, varchar
, nchar
, nvarchar
, आदि) जो उपयोगकर्ता-नियंत्रित स्रोतों से आता है, उसे उपरोक्त विधियों में से एक का उपयोग करना चाहिए। इसका मतलब यह है कि जिन चीज़ों को आप संख्या होने की उम्मीद करते हैं, वे भी उद्धृत हो जाती हैं यदि वे स्ट्रिंग चर में संग्रहीत हैं।
अधिक विवरण के लिए, <स्ट्राइक>माइक्रोसॉफ्ट मैगजीनस्ट्राइक> देखें <उप>(अप्रचलित लिंक:2016-10-19)उप> ।
यहां तीनों विधियों का उपयोग करके एक उदाहरण दिया गया है:
EXEC 'SELECT * FROM Employee WHERE Salary > ''' +
REPLACE(@salary, '''', '''''') + -- replacing quotes even for numeric data
''' ORDER BY ' + QUOTENAME(@sort_col) + ' ' + -- quoting a name
CASE @sort_dir WHEN 'DESC' THEN 'DESC' END -- whitelisting
यह भी ध्यान रखें कि EXEC
. में सभी स्ट्रिंग ऑपरेशन इनलाइन करके करें बयान में कटौती की समस्याओं से कोई सरोकार नहीं है। यदि आप चर के लिए मध्यवर्ती परिणाम निर्दिष्ट करते हैं, तो आपको जरूरी सुनिश्चित करें कि परिणाम धारण करने के लिए चर काफी बड़े हैं। अगर आप SET @result = QUOTENAME(@name)
करते हैं आपको @result
. परिभाषित करना चाहिए कम से कम 258 (2 * 128 + 2) वर्ण धारण करने के लिए। अगर आप SET @result = REPLACE(@str, '''', '''''')
करते हैं आपको @result
. परिभाषित करना चाहिए @str
. के आकार का दोगुना होना (@str
. में प्रत्येक वर्ण मान लें उद्धरण हो सकता है)। और निश्चित रूप से, अंतिम SQL कथन धारण करने वाला स्ट्रिंग चर इतना बड़ा होना चाहिए कि सभी स्थिर SQL और सभी परिणाम चर धारण कर सकें।