SQL सर्वर में सीखने के लिए बहुत कुछ है और मुझे यह हमेशा अद्भुत लगता है। ग्राहकों के साथ मेरी बातचीत अक्सर SQL इंजेक्शन के आसपास सुरक्षा प्रश्नों के साथ आती है। कई लोगों ने दावा किया है कि SQL इंजेक्शन एक SQL सर्वर समस्या है। मुझे उन्हें यह बताने में काफी समय लगता है कि SQL सर्वर और SQL इंजेक्शन के बारे में कुछ भी नहीं है। SQL इंजेक्शन गलत कोडिंग प्रथाओं का परिणाम है। मेरे द्वारा दी गई सिफारिशों में से एक डायनेमिक SQL का उपयोग नहीं करने के बारे में है। ऐसी कुछ स्थितियां हो सकती हैं जहां आप इससे बच नहीं सकते। मेरी एक ही सलाह होगी, हो सके तो परहेज करें। इस ब्लॉग में, मैं गतिशील SQL और आपके पास एक संभावित समाधान के कारण SQL इंजेक्शन समस्या प्रदर्शित करूँगा।
मान लें कि हमारे पास एक साधारण खोज पृष्ठ है जहां उपयोगकर्ता रिक्त खोज का उपयोग कर सकता है या किसी भी क्षेत्र में फ़िल्टर प्रदान कर सकता है। हमने "प्रथम नाम" और "अंतिम नाम" का उपयोग करने के लिए दो फ़ील्ड प्रदान किए हैं। उपयोगकर्ता कुछ टाइप करता है और खोज हिट करता है। यहां हमारी संग्रहीत कार्यविधि का कोड है जो दृश्य के पीछे सक्रिय होता है।
USE AdventureWorks2014 GO CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName ,MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE ''' + @firstName + '''' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE ''' + @lastName + '''' EXEC (@sql) END
यदि मैं इस स्ट्रिंग का उपयोग अंतिम नाम में निष्पादित करने के लिए करता हूं ";ड्रॉप टेबल t1–
EXEC search_first_or_last '%K%', ''';drop table t1--'
डायनेमिक स्ट्रिंग होगी
SELECT FirstName, MiddleName, LastName FROM Person. Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'
क्या आप समस्या देखते हैं? हाँ, उपयोगकर्ता तालिका t1 को छोड़ सकते हैं यदि कोड उच्च विशेषाधिकार वाले खाते के अंतर्गत चल रहा हो।
समस्या के समाधान में से एक sp_executesql का उपयोग करना होगा। यहां उपयोग कर बेहतर संस्करण है
CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName , MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE @firstName' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE @lastName ' EXEC sp_executesql @sql ,N'@firstName nvarchar(50), @lastName nvarchar(50)' ,@firstName ,@lastName END
आशा है कि आप इसका उपयोग करने और अपने प्रोजेक्ट में लागू करने में सक्षम होंगे। क्या आप अपने उत्पादन कोड में इन सरल तकनीकों का उपयोग कर रहे हैं? क्या आपने कभी ऑडिट के दौरान इसी तरह की समस्याओं का सामना किया है? मुझे अपनी सीख के बारे में बताएं।