2010-09-17 13 views
8

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

उत्तर

10

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

उदा।, यह एक एसक्यूएल इंजेक्शन हमले के लिए प्रवण है: आपकी पैरामीटरयुक्त क्वेरी एक उपयोगकर्ता नाम को संग्रहीत प्रक्रिया में पास करती है, और संग्रहीत प्रक्रिया के भीतर पैरामीटर को SQL कमांड से जोड़ा जाता है और फिर निष्पादित किया जाता है।

कई प्रकार के एसक्यूएल इंजेक्शन हमलों के उदाहरण के लिए, यह SQL Injection Cheat Sheet देखें। आप देखेंगे कि सिंगल कोट्स से बचने से बस सतह खरोंच हो रही है, और इसके आसपास कई तरीके हैं।

+0

तो समाधान क्या है? –

+0

@ एमएच: सभी 'साथ' –

+0

को बदलना समाधान गतिशील एसक्यूएल का कभी भी उपयोग नहीं करना है। यदि यह संभव नहीं है, तो आपको यह सुनिश्चित करने के लिए अत्यधिक लंबाई तक जाना होगा कि आप किसी भी स्ट्रिंग से ठीक से बचें जो कि SQL कथन से जुड़ा होगा, और यह भी विचार करें कि डोमेन पर स्ट्रिंग को कैसे घुमाया जा रहा है (उदाहरण के लिए, HTML -> जावास्क्रिप्ट - -> यूआरएल एन्कोडिंग ->), क्योंकि उन परिवर्तनों के कारण अतिरिक्त जटिलताओं हो सकती हैं। – RedFilter

2

यदि आप उन पैरामीटर के साथ गतिशील एसक्यूएल क्वेरी बनाने जा रहे हैं (उदाहरण के लिए संग्रहीत प्रक्रिया में पास किया गया है) तो सावधानी बरतने पर एसक्यूएल इंजेक्शन का मौका मिलता है।

9

हां और नहीं। हां, यदि आपके सभी SQL कथन वास्तव में स्थिर हैं और केवल पैरामीटर का उपयोग करते हैं, तो आप SQL इंजेक्शन हमलों से 100% सुरक्षित हैं।

समस्या तब आती है जब पैरामीटर स्वयं गतिशील SQL कथन बनाने के लिए उपयोग किए जाते हैं। एक उदाहरण एक संग्रहित प्रक्रिया होगी जो अलग-अलग विकल्पों की भीड़ पूछने के लिए गतिशील रूप से एक SQL कथन उत्पन्न करती है, जहां एक एकल मोनोलिथिक कथन अव्यवहारिक होगा। हालांकि इस समस्या के बेहतर समाधान हैं, यह एक आम बात है।

+0

100%, जो मानते हैं कि एमएस या नोवेल ने कोई गलती नहीं की है। –

1

तैयार डेटाबेस का उपयोग करके आप हमेशा एसक्यूएल इंजेक्शन के जोखिम को कम कर सकते हैं, बशर्ते आपका डेटाबेस इंजन उनका समर्थन करे।

वैसे भी, तैयार बयान एसक्यूएल इंजेक्शन को अवरुद्ध करने का शायद सबसे सुरक्षित तरीका है।

5

हाँ आप मापदंडों का उपयोग करके सभी एसक्यूएल इंजेक्शन हमलों से बचने कर सकते हैं, जब तक कि आप पैरामीटर का उपयोग कॉल स्टैक नीचे विशेष रूप से सभी तरह। उदाहरण के लिए:

  • आपका ऐप कोड डेटाबेस में संग्रहीत प्रक्रिया या गतिशील एसक्यूएल को कॉल करता है। सभी मानों को पारित करने के लिए पैरामीटर का उपयोग करना चाहिए।
  • संग्रहीत प्रक्रिया या गतिशील एसक्यूएल आंतरिक रूप से किसी अन्य संग्रहीत प्रक्रिया या गतिशील SQL कथन पर कॉल करता है। यह सभी मानों को पारित करने के लिए पैरामीटर का भी उपयोग करना चाहिए।
  • कोड से बाहर होने तक विज्ञापन-infinitum दोहराएं।

आप एसक्यूएल सर्वर में प्रोग्रामिंग रहे हैं, तो आप sp_executesql का उपयोग गतिशील एसक्यूएल निष्पादित करने के लिए कर सकते हैं, और यह आप को परिभाषित करते हैं और बयान निष्पादित किया जा रहा करने के लिए parameterised मूल्यों पारित करेंगे।

+0

+1 मुझे लगता है कि लोग भूल जाते हैं कि आप डायनामिक एसक्यूएल के साथ पैरामीटर का उपयोग कर सकते हैं। – dotjoe

1

समस्या SQL स्टेटमेंट गतिशील रूप से बना रही है।

उदाहरण के लिए, आप उपयोगकर्ता द्वारा चुने गए कॉलम के आधार पर परिणाम ऑर्डर करना चाहेंगे। अधिकांश डेटाबेस में, आप यहां पैरामीटर का उपयोग नहीं कर सकते ("ORDER BY?" काम नहीं करता है)। तो आपको + कॉलम "ऑर्डर" करना होगा। अब, यदि "कॉलम" स्ट्रिंग है, तो आपके वेब-एप्लिकेशन का उपयोगकर्ता वहां कोड इंजेक्ट कर सकता है (जो आसान नहीं है, लेकिन संभव है)।

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

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