फ़ंक्शन SQL-सर्वर के साथ डायनेमिक-एसक्यूएल में एक पहचानकर्ता को क्या कहता है?


11

डायनामिक एसक्यूएल जेनरेशन के लिए सेफ-क्वोटिंग आइडेंटिफ़ायर का SQL सर्वर तरीका क्या है।

मैं एक गतिशील रूप से उत्पन्न स्टेटमेंट के लिए डायनामिक रूप से जेनरेट किए गए कॉलम का नाम कैसे सुनिश्चित कर सकता हूं कि कॉलम स्वयं SQL- इंजेक्शन हमला नहीं है।

मान लीजिए कि मेरे पास SQL ​​स्टेटमेंट है,

SELECT [$col] FROM table;

जो अनिवार्य रूप से के रूप में ही है

'SELECT [' + $col + '] FROM table;'

क्या एक इंजेक्शन हमले को रोकता है जहां

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";

जिसके परिणामस्वरूप

SELECT [name] FROM sys.objects;
DROP TABLE my.accounts;
-- ] FROM table;

जवाबों:


14

फ़ंक्शन जिसे आप ढूंढ रहे हैं वह है 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' यह कुछ मनमाना कोड है। हो सकता है कि उसने कोई टेबल गिरा दिया हो या उसने अनुमति दे दी हो - '।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.