फ़ंक्शन जिसे आप ढूंढ रहे हैं वह है QUOTENAME
!
स्क्वायर ब्रैकेट तकनीक के व्यावहारिक उपयोग के माध्यम से, आप गर्म एसक्यूएल इंजेक्शन हमलों की रोकथाम में सहायता के लिए तारों को सुरक्षित रूप से संलग्न कर सकते हैं।
ध्यान दें कि किसी चीज़ के चारों ओर सिर्फ चौकोर कोष्ठक चिपकाने से वह सुरक्षित रूप से बाहर नहीं निकलता है, हालाँकि आप ऑब्जेक्ट नामों में अमान्य वर्णों के साथ अपने कोड से बच सकते हैं।
अच्छा कोड है
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
बुरा कोड
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
एक विशिष्ट उदाहरण देने के लिए ...
निम्नलिखित प्रारंभिक इनपुट के लिए ठीक काम करता है
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
लेकिन दुर्भावनापूर्ण इनपुट के साथ यह SQL इंजेक्शन के लिए असुरक्षित है
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
QUOTENAME
सही ढंग से उपयोग एम्बेडेड से बच जाता है ]
और प्रयास किए गए SQL इंजेक्शन को होने से रोकता है।
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM ' + QUOTENAME(@ObjectName);
EXEC (@dynSql);
अमान्य ऑब्जेक्ट नाम 'sysobjects]; SELECT' यह कुछ मनमाना कोड है। हो सकता है कि उसने कोई टेबल गिरा दिया हो या उसने अनुमति दे दी हो - '।