2016-09-07 12 views
5

मैं IQueryable का निर्माण कर रहा हूं जहां मैं प्रासंगिक फ़िल्टर लागू कर रहा हूं, और मैं यहां कोड की इस पंक्ति में आया हूं।इकाई फ्रेमवर्क + एसक्यूएल इंजेक्शन

items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection)); 

क्या यह स्निपेट एसक्यूएल इंजेक्शन के लिए कमजोर है? या ये (स्ट्रिंग) पैरामीटर दृश्यों के पीछे पैरामीटरकृत हैं? मैंने माना कि सभी लिंक प्रश्नों से बच निकला और मेरे लिए पैरामीटर किया गया, लेकिन तथ्य यह है कि मैं इस तरह एक स्ट्रिंग में सीधे पास करने में सक्षम हूं, मुझे फेंक रहा है।

+0

आप के लिए कि बयान काम करता है? क्या आपके पास इसे लागू करने वाला स्थिर विस्तार विधि है? मैं 'ऑर्डरबी' से लम्बा अभिव्यक्ति नहीं ले रहा हूं। – sgeddes

+0

यह एक्सटेंशन 'System.Linq.Dynamic' नामस्थान में स्थित था। एक विधि हस्ताक्षर 'स्थिर IQueryable OrderBy साथ (इस IQueryable स्रोत, स्ट्रिंग आदेश, [] मूल्यों आपत्ति पैरामीटर)'। – alexhuang

+1

सिस्टम की तरह दिखता है .Linq.Dynamic CodePlex पर होस्ट की गई एक ओपन-सोर्स प्रोजेक्ट है। स्रोत कोड http://dynamiclinq.codeplex.com/SourceControl/latest#DynamicLinq/System.Linq.Dynamic/Dynamic.cs पर है। जो मैं देख सकता हूं उससे वे स्ट्रिंग डेटा ले रहे हैं और अभिव्यक्ति वृक्ष को संशोधित करने के लिए इसका उपयोग कर रहे हैं, नहीं, यह एसक्यूएल इंजेक्शन के लिए कमजोर नहीं है। –

उत्तर

12

पहले प्वाइंट:

  • एक प्रश्न के एक उपभोक्ता:

आप निम्नलिखित कारणों के लिए संभावित अविश्वसनीय कॉल करने के संपर्क में हैं कि तरीकों से IQueryable<T> प्रकार लौटने से बचने के लिए है जो IQueryable<T> प्रकार का खुलासा करता है परिणाम को संभावित डेटा का खुलासा करने याके आकार को बढ़ाने के परिणाम पर कॉल कर सकता हैपरिणाम सेट।

public IQueryable<Customer> GetCustomer(int customerId)

इस क्वेरी के एक उपभोक्ता लौटे IQueryable<Customer> पर .Include("Orders") कह सकते हैं कि डेटा पुनः प्राप्त क्वेरी को बेनकाब करने का इरादा नहीं था करने के लिए: उदाहरण के लिए, निम्नलिखित विधि हस्ताक्षर पर विचार करें। विधि के रिटर्न प्रकार को IEnumerable<T> पर बदलकर और एक विधि (जैसे .ToList()) को कॉल करके इससे बचा जा सकता है जो परिणामों को पूरा करता है।

  • क्योंकि IQueryable<T> प्रश्नों क्रियान्वित कर रहे हैं जब परिणाम से अधिक दोहराया कर रहे हैं, कि एक IQueryable<T> प्रकार को उजागर करता है एक प्रश्न के एक उपभोक्ता अपवाद फेंक दिया जाता है पकड़ सकते थे। Exceptions में जानकारी शामिल हो सकती है जो उपभोक्ता के लिए नहीं है।

दूसरा प्वाइंट:

कैसे एसक्यूएल इंजेक्शन के हमलों को रोकने के लिए?

  • इकाई SQL इंजेक्शन हमले:

SQL इंजेक्शन हमले इकाई एसक्यूएल में मूल्यों है कि एक query predicate में और parameter names में किया जाता है करने के लिए malicious input आपूर्ति द्वारा किया जा सकता है।

एसक्यूएल इंजेक्शन के जोखिम से बचने के लिए

आप इकाई एसक्यूएल कमांड पाठ के साथ उपयोगकर्ता इनपुट गठबंधन कभी नहीं करना चाहिए

इकाई एसक्यूएल accept parameters हर जगह है कि शाब्दिक स्वीकार कर रहे हैं प्रश्नों। इसके बजाय आप शाब्दिक सीधे क्वेरी में एक बाहरी एजेंट से इंजेक्शन लगाने की पैरामिट्रीकृत प्रश्नों का उपयोग करना चाहिए। तुम भी का उपयोग कर क्वेरी बिल्डर तरीकों पर विचार करना चाहिए सुरक्षित रूप से इकाई एसक्यूएल के निर्माण के लिए।

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

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

संदर्भ:Security Considerations (Entity Framework)

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