खोज…


स्ट्रिंग के रूप में दिए गए SQL कथन निष्पादित करें

कुछ मामलों में, आपको स्ट्रिंग में रखी SQL क्वेरी को निष्पादित करने की आवश्यकता होगी। EXEC, EXECUTE, या सिस्टम प्रक्रिया sp_executesql स्ट्रिंग के रूप में प्रदान की गई किसी भी SQL क्वेरी को निष्पादित कर सकती है:

sp_executesql N'SELECT * FROM sys.objects'
-- or
sp_executesql @stmt = N'SELECT * FROM sys.objects'
-- or
EXEC sp_executesql N'SELECT * FROM sys.objects'
-- or
EXEC('SELECT * FROM sys.columns')
-- or
EXECUTE('SELECT * FROM sys.tables')

यह प्रक्रिया स्टेटमेंट टेक्स्ट के रूप में प्रदान की गई SQL क्वेरी के समान परिणाम-सेट लौटाएगी। sp_executesql एसक्यूएल क्वेरी को स्ट्रिंग शाब्दिक, चर / पैरामीटर या अभिव्यक्ति के रूप में प्रदान कर सकता है:

declare @table nvarchar(40) = N'product items'
EXEC(N'SELECT * FROM ' + @table)
declare @sql nvarchar(40) = N'SELECT * FROM ' + QUOTENAME(@table);
EXEC sp_executesql @sql

@Table वैरिएबल में विशेष वर्णों से बचने के लिए आपको QUOTENAME फ़ंक्शन की आवश्यकता है। इस फ़ंक्शन के बिना आपको सिंटैक्स त्रुटि मिलेगी यदि @table चर में रिक्त स्थान, कोष्ठक, या किसी अन्य विशेष वर्ण जैसी कोई चीज़ होती है।

डायनेमिक SQL को अलग यूजर के रूप में निष्पादित किया जाता है

आप USER = 'डेटाबेस उपयोगकर्ता का नाम' का उपयोग करके SQL क्वेरी को विभिन्न उपयोगकर्ता के रूप में निष्पादित कर सकते हैं

EXEC(N'SELECT * FROM product') AS USER = 'dbo'

SQL क्वेरी को dbo डेटाबेस उपयोगकर्ता के तहत निष्पादित किया जाएगा। Dbo उपयोगकर्ता पर लागू सभी अनुमति जाँच SQL क्वेरी पर जाँच की जाएगी।

गतिशील SQL के साथ SQL इंजेक्शन

गतिशील प्रश्न हैं

SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)

यदि उपयोगकर्ता चर का मान myusername '' या 1 = 1 है - तो निम्नलिखित क्वेरी को निष्पादित किया जाएगा:

SELECT COUNT(*)
FROM AppUsers 
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''

चर @username के मूल्य के अंत में टिप्पणी क्वेरी और स्थिति 1 = 1 के अनुगामी भाग का मूल्यांकन करेगी। इस क्वेरी के द्वारा लौटाए गए कम से कम एक उपयोगकर्ता द्वारा जाँचा जाने वाला अनुप्रयोग 0 से अधिक की गिनती लौटाएगा और लॉगिन सफल होगा।

इस एप्रोच हमलावर का उपयोग करके आवेदन में प्रवेश कर सकते हैं, भले ही वह वैध उपयोगकर्ता नाम और पासवर्ड न जानता हो।

मापदंडों के साथ गतिशील एसक्यूएल

इंजेक्शन से बचने और समस्याओं से बचने के लिए, गतिशील SQL प्रश्नों को मापदंडों के साथ निष्पादित किया जाना चाहिए, जैसे:

SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = @user AND Password = @pass
EXEC sp_executesql @sql, '@user nvarchar(50), @pass nvarchar(50)', @username, @password

दूसरा पैरामीटर उनके प्रकारों के साथ क्वेरी में उपयोग किए जाने वाले मापदंडों की एक सूची है, इस सूची के बाद चर प्रदान किए जाते हैं जिन्हें पैरामीटर मानों के रूप में उपयोग किया जाएगा।

sp_executesql विशेष वर्णों से बच जाएगा और sql क्वेरी निष्पादित करेगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow