Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एसक्यूएल सर्वर - एसक्यूएल इंजेक्शन हमले से बचने के लिए गतिशील एसक्यूएल को संभालने की एक चाल?

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

आशा है कि आप इसका उपयोग करने और अपने प्रोजेक्ट में लागू करने में सक्षम होंगे। क्या आप अपने उत्पादन कोड में इन सरल तकनीकों का उपयोग कर रहे हैं? क्या आपने कभी ऑडिट के दौरान इसी तरह की समस्याओं का सामना किया है? मुझे अपनी सीख के बारे में बताएं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ClusterControl 1.7.5 की घोषणा:PostgreSQL 12 और MongoDB 4.2 के लिए उन्नत क्लस्टर रखरखाव और समर्थन

  2. SQL:उन पंक्तियों का चयन करना जहाँ स्तंभ मान पिछली पंक्ति से बदल गया है

  3. क्या मैं इसे शुद्ध MySQL के साथ हल कर सकता हूं? ('' कॉलम में अलग किए गए मानों से जुड़ना)

  4. MySQL स्क्रिप्ट कमांड लाइन के लिए पैरामीटर पास करें

  5. डेटाबेस स्कीमा क्या है?