2012-11-21 13 views
20

यदि मेरे पास एक एएसपी.NET वेब एप्लिकेशन है जिसमें SQL सर्वर डेटाबेस है, तो यह मानना ​​सुरक्षित है कि यदि कोई SQL इंजेक्शन हमला किया जा रहा है तो यह SqlCommand कक्षा के उदाहरण से गुजर जाएगा?क्या एसक्यूएल इंजेक्शन हमले एसक्यूएल कॉमांड के अलावा किसी अन्य चीज़ के माध्यम से निष्पादित किया जा सकता है?

पृष्ठभूमि:

मैं एक स्थिति है जहाँ मैं एक नहीं बल्कि बड़े वेब अनुप्रयोग कुछ SQL इंजेक्शन कमजोरियों है कि विरासत में मिला है में हूँ। मुझे अन्य मुद्दों के लिए कोड को देखकर कई मिल गए हैं, लेकिन मुझे आश्चर्य है कि सभी एसक्यूएल इंजेक्शन भेद्यताएं खोजने का एक सुरक्षित तरीका SqlCommand के उदाहरणों के लिए सभी फाइलों को खोजना होगा और फिर यह देखने के लिए जांच करें कि वे पैरामीट्रिज्ड प्रश्न हैं या नहीं। क्या यह एक ठोस योजना है?

उत्तर

20

मैं विशेष रूप से सिर्फ नहीं लग रही हैं SqlCommand के लिए - कोड DBCommand या IDbCommand इस्तेमाल कर सकते हैं। इसे ईएफ, एल 2 एस या एनएचबर्ननेट जैसे ओआरएम में लपेटा जा सकता है (सभी कच्चे उपयोग के कुछ स्तर की पेशकश करते हैं)। यह कुछ "डैपर" या simple.data जैसे कुछ का उपयोग कर सकता है। या डेटाटेबल/डेटा एडाप्टर। आपके पास कोड हो सकता है जो विरासत ओएलडीडीबी या एडीओडीबी एक्सेस का उपयोग करता है। बिल्ली, हम सभी जानते हैं कि आप अपना खुद का निम्न-स्तर वाला टीडीएस एपीआई लिख सकते थे।

तो: यह डेटा एक्सेस कोड की जांच करने के लिए नीचे आता है, जो कई रूप ले सकता है। यदि आपका विभागीय दृष्टिकोण "SqlCommand सीधे उपयोग करें" है, तो यह चीजों को बदल देता है।

इसके अलावा: एसक्यूएल इंजेक्शन नेट तक सीमित है नहीं - तुम, उदाहरण के लिए, एक कच्चे आदेश पाठ में एक एसक्यूएल इंजेक्शन जोखिम बना सकते हैं या प्रक्रिया संग्रहीत भी अगर आप parameterise, अगर TSQL संयोजन के किसी भी प्रकार से करता है EXEC के माध्यम से आवंटित करने के लिए गतिशील एसक्यूएल बनाने के लिए। ध्यान दें कि sp_executesql उसमें मदद कर सकता है।

+0

यदि आप किसी और के प्रोजेक्ट पर बात कर रहे हैं तो आखिरी बिट बहुत महत्वपूर्ण है। यदि स्पॉक्स हैं तो आप उन्हें पूरी तरह से ऑडिट करना चाहते हैं। सिर्फ इसलिए कि डेटा पहले से ही डीबी में है, इसका मतलब यह नहीं है कि एक एसक्यूएल कमांड में सम्मिलित होना सुरक्षित है। – Wedge

+0

महान जवाब! अंतिम प्रश्न - यदि एसक्यूएल सर्वर स्तर पर एक इंजेक्शन हमला किया जाना है तो इसे 'EXEC' के उपयोग के माध्यम से किया जाना चाहिए? –

8

तुम भी चीजें हैं जो उपयोग या एक SqlCommand शामिल देखने के लिए की आवश्यकता होगी। इनमें SqlDataAdapter शामिल हैं, दूसरों के बीच।

+0

इसके अतिरिक्त, पैरामीटर के रूप में सेट अप करने के बजाय क्वेरी स्ट्रिंग में पैरामीटर को संयोजित करने के लिए विशेष रूप से उपयोग करें। यदि आपके पास एक ऐसा फ़ंक्शन है जो किसी भी स्ट्रिंग को पास करता है, तो इसे अप्रचलित और किसी भी उपयोग को दोबारा चिह्नित करें जो पैरामीटर के संग्रह को स्वीकार करने वाले ओवरलोड का उपयोग करने में त्रुटि करता है। – KeithS

+0

स्ट्रिंग concatenation का उपयोग करने वाले कोड से निपटने में, मुझे String.Format पर एक कॉल में concatenation बारी करने के लिए ReSharper का उपयोग करने के लिए एक उपयोगी पहला कदम मिला है। इसके बाद मैं प्रारूप तारों को स्थिरांक में पुन: सक्रिय कर दूंगा, या फिर स्ट्रिंग को संदर्भित करूँगा। नामित विधियों में प्रारूप। यह डुप्लिकेशंस खोजने के लिए और अधिक आसान हो जाता है, और उन तरीकों में दोबारा प्रतिक्रिया करने के लिए जो स्ट्रिंग बनाने वाली विधियों के बजाय एसक्लोकॉमैंड बनाते हैं। –

+0

सहायक पुस्तकालय हो सकते हैं। 'डेटा एक्सेस एप्लिकेशन ब्लॉक' या पुराना एसक्लहेल्पर आसान इंजेक्शन भेद्यता के लिए अनुमति देता है। – Tass

7

सिर्फ इसलिए कि आप एक parametrized क्वेरी लाइब्रेरी का उपयोग कर रहे हैं इसका मतलब यह नहीं है कि इसका उपयोग ठीक से किया जाता है। ऑडिटिंग कोड के दौरान मैंने उन मामलों को देखा है जहां पैरामीट्रिज्ड क्वायर का उपयोग किया जा रहा है, लेकिन क्वेरी के कुछ हिस्सों को स्ट्रिंग कॉन्सटेनेशन का उपयोग करके अभी भी बनाया गया है। अधिक विशेष रूप से तालिका का नाम और क्वेरी का सीमा/आदेश भाग सामान्य गलतियां हैं।

यदि आप स्थिर विश्लेषण पर पूरी तरह से सेट हैं तो सर्वोत्तम शर्त आवेदन में सभी प्रश्नों के लिए grep है और फिर सुनिश्चित करें कि प्रत्येक व्यक्ति ठीक से बनाया गया है। हां इसमें काफी समय लगेगा, और यह दिमागी धुंधला हो सकता है। ब्रेक लें, नोट्स लें और दबाएं। जब आप एसक्यूएल इंजेक्शन पाते हैं तो यह पुरस्कृत होगा!

10

आपके डेटाबेस स्कीमा के आधार पर आपको संग्रहीत प्रोसेस में हमलों की जांच करने की आवश्यकता हो सकती है (माना जाता है कि आप संग्रहित प्रोसेस का उपयोग कर रहे हैं)। मैंने देखा है लोगों को अपने कोड में paramterised संग्रहित प्रक्रियाओं का उपयोग करें, लेकिन proc में वे सिर्फ क्वेरी करने के लिए EXEC का उपयोग करें:

CREATE PROC Dummy 
(
    @Str VARCHAR(50) 
) 
AS 
EXEC ('SELECT * FROM Table Where Column = ''' + @Str + '''') 
संबंधित मुद्दे