2012-01-05 12 views
38

गतिशील LINQ पुस्तकालय (link) का उपयोग करना, यह इंजेक्शन के लिए असुरक्षित है? और (यदि हां) तो यह कैसे संरक्षित किया जा सकता है?गतिशील LINQ के माध्यम से इंजेक्शन संभव है?

Security Considerations (Entity Framework) से कुछ पृष्ठभूमि:

संस्थाओं इंजेक्शन हमलों के लिए LINQ:

हालांकि क्वेरी रचना संस्थाओं के लिए LINQ में संभव है, यह ऑब्जेक्ट मॉडल एपीआई के माध्यम से किया जाता है। इकाई एसक्यूएल प्रश्नों के विपरीत, संस्थाओं प्रश्नों का LINQ स्ट्रिंग परिवर्तन या संयोजन का उपयोग करके बना नहीं कर रहे हैं, और वे परंपरागत एसक्यूएल इंजेक्शन हमले की संभावना नहीं हैं।

चूंकि डायनामिक एसक्यूएल तारों का उपयोग करके बना है, इसका मतलब यह है कि यह इंजेक्शन वैक्टरों के लिए अतिसंवेदनशील हो सकता है? या LINQ एसक्यूएल के लिए स्वचालित रूप से गतिशील LINQ पुस्तकालय के भीतर अंतर्निहित डेटाप्रकार के आधार पर अपने मूल्यों parametrizing की देखभाल करेगा?

या यह पूरी तरह से सुरक्षित के बाद से गतिशील क्वेरी स्मृति में बजाय एसक्यूएल (जिससे एसक्यूएल अनुक्रमित से कोई लाभ negating) के खिलाफ प्रदर्शन किया जाएगा है?

मैं DynamicLibrary.cs कोड को समझने के माध्यम से काम कर रहा है, लेकिन मुझे यकीन है कि मैं आसानी से कुछ अनदेखी की जा सकती हूँ।

चूंकि यह प्रश्न गतिशील LINQ लाइब्रेरी के बारे में है, तो इस प्रश्न को linq-to-sql और linq-to-entities (एंटीटी फ्रेमवर्क के संदर्भ के बावजूद) पर लागू होने के लिए माना जा सकता है।

उत्तर

29

ठीक है, मैं सहमत नहीं हूं कि गतिशील लिंक में इंजेक्शन संभव नहीं है।

क्या Ɖiamond ǤeezeƦ द्वारा answer में वर्णित सही है लेकिन यह देखते हुए भाषा के भीतर निर्माण के रूप में मानक Linq करने के लिए appies - C# या VB.Net या लैम्ब्डा कार्यों के साथ .Where की तरह विस्तार के तरीकों को फोन करके।

फिर, सच है, कुछ भी इंजेक्ट करना संभव नहीं है क्योंकि .NET Linq से SQL अनुवादक निश्चित रूप से लिखा गया है। इस प्रकार, "एसक्यूएल इंजेक्शन" संभव नहीं यह सच है है।

हालांकि, गतिशील लिंक के साथ क्या संभव है "लिंक इंजेक्शन" हमला है। ओपी द्वारा उद्धृत LINQ की सुरक्षा के लिए स्पष्टीकरण में, यह कहा गया है:

संस्थाओं प्रश्नों का LINQ स्ट्रिंग परिवर्तन या संयोजन का उपयोग करके बना नहीं कर रहे हैं, और वे पारंपरिक SQL इंजेक्शन हमले की संभावना नहीं हैं।

और मूल रूप से यह एक गिस्ट है। यदि स्ट्रिंग मैनिपुलेशन द्वारा प्रश्नों को तैयार किया गया है तो यह इंजेक्शन हमलों से ग्रस्त है। और गतिशील लिंक वास्तव में तारों से बना है, इसलिए यह संभवतः इंजेक्शन द्वारा हमला करने के लिए प्रवण है।

जाहिर है, हमलावर को इस तथ्य से अवगत होना होगा कि आप डायनामिकलिंक का उपयोग कर रहे हैं और केवल डेटा तैयार करने पर हमला कर सकते हैं ताकि इसका परिणाम वैध दुर्भावनापूर्ण डायनामिक लिंक क्वेरी में हो।

मैं इस तथ्य को हाइलाइट करना चाहते हैं - अंतिम एसक्यूएलसुरक्षित रूप से बना है, लेकिन है कि क्या मूल गतिशील Linq सुरक्षित आप पर निर्भर करता है।

आपके गतिशील LINQ क्वेरी सुरक्षित बनाने के लिए जरूरी सभी उपयोगकर्ता इनपुट के लिए प्लेसहोल्डर उपयोग करने के लिए है। कभी भी अपनी स्ट्रिंग को संयोजित न करें!

dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\""); 

इनपुट स्वच्छ नहीं है और नहीं बच गए, हमलावर संभवतः इनपुट सकता है::

निम्न क्वेरी कल्पना कीजिए

200" or allowed == 0 and code == "200 

जो परिणाम होगा में:

allowed == 1 and code == "200" or allowed == 0 and code == "200" 

इससे बचने के लिए, आपको प्लेसहोल्डर का उपयोग करना चाहिए:

dataset.Where("allowed == 1 and code == @0", user_entered_data); 

DynamicLinq प्लेसहोल्डर कर देगा (इस मामले में: उपयोगकर्ता के दर्ज किया गया डेटा) एक लैम्ब्डा तर्क (क्वेरी में श्रृंखलाबद्ध के बजाय) और निर्भर पर LINQ करने के लिए-संस्थाओं (या जो भी बैकएंड है) सुरक्षित रूप से करने के लिए कन्वर्ट करने के लिए एसक्यूएल।

+0

अच्छा बिंदु। ढांचा आपको अपने आप से बचा नहीं सकता है। –

+0

इसलिए डेटा लीक करने के परिणामस्वरूप इंजेक्शन अभी भी संभव है, लेकिन आप अभी भी 'बॉबी टेबल' से अलग हैं (डेटा छोड़ना/डेटा हटाएं/हटाएं) घटना; क्या आप डेटाबेस में रिकॉर्ड्स को बदलने के लिए एक चुनिंदा और कहां क्लॉज का कारण बन सकते हैं? – Seph

+2

@ सेफ - नहीं, रिकॉर्ड्स को बदलना संभव नहीं है क्योंकि linq क्वेरी कभी भी SQL, अद्यतन या ड्रॉप करने के लिए अनुवाद नहीं करेगा। "जहां" फ़िल्टर संशोधित करके अनधिकृत डेटा तक पहुंच प्राप्त करने का एकमात्र संभावित हमला हो सकता है। – Krizz

3

मैं क्या System.Data.Linq नाम स्थान की जांच से पता से है कि एक एसक्यूएल वस्तु पेड़ LINQ क्वेरी से बनाया गया है और इस प्रक्रिया के हिस्से के रूप में SqlParameterizer वर्ग मानकों के साथ सभी इनलाइन मूल्यों को बदलने के लिए कहा जाता है। मान तब पैरामीटर को सौंपा जाता है। तो एसक्यूएल इंजेक्शन हमलों संभव नहीं होना चाहिए।

+0

यह आमतौर पर linq के लिए सच है, लेकिन गतिशील linq (जो ओपी पूछता है) के लिए जरूरी नहीं है जहां प्रश्न स्ट्रिंग हैं, मेरा जवाब देखें। – Krizz

संबंधित मुद्दे