तर्क के लिए, आइए बस यह कहें कि को को स्थानीय चर बनाने वाला एक SQL क्वेरी है जिसमें एक INSERT है:एसक्यूएल सर्वर: इंजेक्शन हमलों के खिलाफ @param sanitizing
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
यह INSERT में स्तंभ मान भी शामिल है:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
अब, मैं इंजेक्शन हमले के बारे में स्पष्ट रूप से चिंतित हूं, और यह सुनिश्चित करना चाहता हूं कि @ संदेश का मान @ insert का मान दुर्भावनापूर्ण या EXEC को क्वेरी के रूप में विकृत नहीं कर सकता है।
यह हमें मेरे प्रश्न पर लाता है: @ message में वर्णों से बच रहा है? क्या कोई अन्य पात्र है जो @ message में दिखाई दे सकता है जो बाहर निकल सकता है?
उदाहरण:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(जब मैं कहता हूं " है", ऐसा इसलिए है क्योंकि मेरी क्वेरी संग्रहीत प्रक्रिया में है, और यह संग्रहीत प्रक्रिया @table स्वीकार करती है, जो INSERT की गंतव्य तालिका है में। मुझे अपने आर्किटेक्चर पर चर्चा करने में दिलचस्पी नहीं है या क्यों एक प्रक्रिया पैरामीटर के माध्यम से INSERT में तालिका "गतिशील रूप से" निर्दिष्ट है। कृपया इस पर टिप्पणी करने से बचें जब तक कि तालिका निर्दिष्ट करने के लिए EXEC() क्वेरी के अलावा कोई अन्य तरीका न हो जब इनपुट नाम पैरामीटर के रूप में प्राप्त किया जाता है तो INSERT में)।
क्या हम वास्तव में उन प्रश्नों से निपटना चाहते हैं जो जानबूझकर खराब कोड लिखने के तरीके से निपटते हैं? – dkretz
यदि इसका मतलब है समाधान ढूंढना, हाँ। डेवलपर्स को हर समय बकवास कोड से निपटना पड़ता है, खासकर यदि आप $ 8/घंटा के लिए बांग्लादेश में लिखी गई परियोजनाओं से परामर्श और उत्तराधिकारी हैं। हम हमेशा परियोजनाओं को खरोंच से लक्जरी नहीं पाते हैं, जिससे उन्हें * जिस तरह से किया जाना चाहिए था।:) – core