2012-11-30 31 views
27

डैपर एसक्यूएल इंजेक्शन के खिलाफ कैसे मदद करता है? मैं विभिन्न डीएएल प्रौद्योगिकियों का परीक्षण कर रहा हूं और हमारी साइट को सुरक्षित रखने के लिए एक को चुनना है। मैं डैपर (http://code.google.com/p/dapper-dot-net/) की तरफ झुका रहा हूं, लेकिन सुरक्षा के बारे में कुछ सीखने की ज़रूरत है।डैपर और एसक्यूएल इंजेक्शन

उत्तर

40

डैपर एसक्यूएल इंजेक्शन के खिलाफ कैसे मदद करता है?

यह बनाता है यह सच में, सच, पूरी तरह से पैरामिट्रीकृत डेटा का उपयोग करने के लिए आसान कभी या तो इनपुट को श्रेणीबद्ध करने के लिए जरूरत के बिना। विशेष रूप से, क्योंकि आपको बहुत से "पैरामीटर जोड़ने के लिए, पैरामीटर प्रकार सेट करने की आवश्यकता नहीं है, शून्य के लिए जांचें क्योंकि ADO.NET में चिपचिपा नल-हैंडलिंग है, पैरामीटर हैंडलिंग करके 20 पैरामीटर के लिए कुल्ला/दोहराएं" बेवकूफ सुविधाजनक। यह DataTable का उपयोग करने के प्रलोभन से परहेज करते हुए, वस्तुओं को पंक्तियों में वास्तव में आसान बनाता है ... हर कोई जीतता है।

टिप्पणियों से:

एक और ... क्या व्यवसायिक वास्तव में मदद करता है तो क्या ज़रूरत है?

, जवाब देने के marc_s के जवाब से उदाहरण लेते हैं, और यह पुराना तरीका लिखने के लिए, हम सभी के साथ शुरू कर दिया है यह सोचते हैं connection है।यह तो है:

List<Dog> dogs = new List<Dog>(); 
using(var cmd = connection.CreateCommand()) { 
    cmd.CommandText = "select Age = @Age, Id = @Id"; 
    cmd.Parameters.AddWithValue("Age", DBNull.Value); 
    cmd.Parameters.AddWithValue("Id", guid); 
    using(var reader = cmd.ExecuteReader()) { 
     while(reader.Read()) { 
      int age = reader.ReadInt32("Age"); 
      int id = reader.ReadInt32("Id"); 
      dogs.Add(new Dog { Age = age, Id = id }); 
     } 
     while(reader.NextResult()) {} 
    } 
} 

को छोड़कर मैं निहायत अति-सरलीकृत कर दिया है, के रूप में यह भी इस तरह के रूप में मुद्दों की एक विस्तृत श्रृंखला के साथ सौदों:

  • मापदंडों
  • परिणाम की अशक्त से निपटने के अशक्त हैंडलिंग कॉलम
  • क्रमसूचक स्तंभ सूचकांक
  • अंतर्निहित तालिका के संरचनात्मक परिवर्तन और के अनुरूप ढलने का उपयोग कर टाइप
  • डेटा ग परिणाम स्तंभों की onversion
  • ओह-तो-आम की विशेष हैंडलिंग "इस सूची में" परिदृश्य
  • "अमल" के लिए, की विशेष हैंडलिंग (विभिन्न पुरातन, तार, enums आदि में से) "यह करने के लिए अलग से आवेदन आदानों "
  • परहेज मूर्खतापूर्ण लिखने की त्रुटियों
  • कई ग्रिड से निपटने
  • से अधिक ऑब्जेक्ट से निपटने कोड रखरखाव को कम करने
  • की एक सूची के लिए एक एकल ग्रिड
  • में क्षैतिज लौटे मनमाना ADO.NET प्रदाताओं के साथ काम (संकेत: 012,शायद ही कभी मौजूद है) ओरेकल, जो इस तरह के "मिनी प्रोफाइलर" दोनों बफ़र के लिए
  • इनबिल्ट समर्थन के रूप में ADO.NET decoratos साथ
  • नाटकों अच्छी तरह से अतिरिक्त विन्यास की जरूरत है जैसी चीजों (के लिए विशिष्ट समर्थन सहित
    • छोटे से मध्यम डेटा के लिए उपयुक्त; कमांड अवधि को कम करता है) और गैर-bufferesd (बड़े डेटा के लिए उपयुक्त; न्यूनतम स्मृति उपयोग के लिए उपयुक्त)
    • प्रदर्शन के बारे में देखभाल करने वाले लोगों द्वारा अनुकूलित और डेटा-एक्सेस और मेटा प्रोग्रामिंग दोनों के बारे में "काफी" पता है
    • आपको अनुमति देता है पीओसीओ/डीटीओ/एनोन-टाइप की अपनी पसंद का उपयोग करने के लिए/पैरामीटर और आउटपुट दोनों के लिए जो कुछ भी
    • dynamic (मल्टी-कॉलम) या प्राइमेटिव आदि के लिए (सिंगल कॉलम के लिए) का उपयोग करने की अनुमति देता है जब आउटपुट पीढ़ी पीढ़ी नहीं करता है एक पीओसीओ/डीटीओ
    • ईएफ
    • जैसे जटिल पूर्ण टाइप किए गए ओआरएम के ओवरहेड से बचें 0 कमजोर टाइप की गई परतों के ऊपरी भाग से बचें DataTable
    • खोलने और बंद करने कनेक्शन के रूप में-आवश्यक
    • और अन्य सामान्य gotchas इस सवाल का जवाब और एक दूसरे के लिए
  • +0

    @niico यह ऐसा कुछ करता है जो 'कुत्ता' नहीं है? –

    +1

    @niico आह, ठीक है, अब आपके साथ। मुझे लगता है कि मेरी आंख ऑटो-सही है कि जब मैं इसे पढ़ता हूं! हाँ, यह स्पष्ट होगा। नोट, हालांकि, वह (जैसा कि बताया गया है) मैं एक और उत्तर से उदाहरण ले रहा था जो 'कुत्ते' को परिवर्तनीय नाम के रूप में इस्तेमाल करता था। –

    +0

    अब, क्या आप पैरामीटरयुक्त प्रश्नों के लिए *** डैपर *** का उपयोग करते हैं? – Kiquenet

    22

    आपको केवल पैरामीटरयुक्त प्रश्न का उपयोग करने की आवश्यकता है जैसा आपको हमेशा करना चाहिए। चूंकि डैपर "कच्चे" एसक्यूएल और एडीओ.NET के लिए सिर्फ एक "छोटा" (और बहुत पतला) विस्तार है - बस पैरामीटरयुक्त एडीओ.NET प्रश्नों और आपूर्ति पैरामीटर का उपयोग करें।

    डैप्पर-डॉट नेट साइट से इस नमूने देखें:

    var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", 
               new { Age = (int?)null, Id = guid }); 
    

    SQL क्वेरी पैरामीटर का उपयोग करता है - और आप "डैप्पर" क्वेरी के लिए उन की आपूर्ति।

    संक्षेप में: - पैरामिट्रीकृत ADO.NET/SQL प्रश्नों तथापि करता है (और उन प्रश्नों बिल्कुल सब पर, साफ-सुथरी द्वारा समर्थित हैं कोई मुद्दा नहीं)

    का उपयोग कर अपने आप में साफ-सुथरी का उपयोग कर एसक्यूएल इंजेक्शन से प्रति के खिलाफ की रक्षा में मदद नहीं करता
    +0

    THX की एक विशाल रेंज। एक और ... डैपर वास्तव में तब क्या करने में मदद करता है? – cdub

    +0

    @Chris: यह एक ** अच्छी, उपयोगकर्ता के अनुकूल .NET ऑब्जेक्ट ** (जैसे 'कुत्ते' वर्ग) में SQL क्वेरी (ऊपर देखें) का परिणाम बदलता है - आपको पंक्तियों/स्तंभों के ढेर के साथ छोड़ने के बजाय आपको एसक्यूएल से वापस प्राप्त करने के बारे में पता लगाने के लिए wade करना होगा .... –

    +0

    मुझे अपने एसक्यूएल प्रश्नों को फिर भी मेरे कोड में बदलना होगा, ताकि इसे नए एसक्यूएल पैरामीटर (...) से जा सके तब डैपर संस्करण? – cdub