चलिए MySQL डेटाबेस (यदि यह मायने रखता है) पर कहें।क्या मैं संग्रहीत प्रक्रियाओं का उपयोग करता हूं तो क्या मैं एसक्यूएल इंजेक्शन से प्रतिरक्षा करता हूं?
उत्तर
नहीं, आप पूरी तरह से सुरक्षित नहीं होंगे। जैसा कि अन्य ने उल्लेख किया है, पैरामीटरयुक्त प्रश्न हमेशा जाने का तरीका हैं - इससे कोई फर्क नहीं पड़ता कि आप डेटाबेस तक कैसे पहुंच रहे हैं।
यह एक शहरी किंवदंती है कि प्रोसेस के साथ आप सुरक्षित हैं। मुझे लगता है कि इस भ्रम के तहत लोग इस कारण हैं क्योंकि ज्यादातर लोग मानते हैं कि आप अपने कोड से पैरामीटर किए गए प्रश्नों के साथ प्रोसेस को कॉल करेंगे।
SqlCommand cmd = new SqlCommand("exec @myProc " + paramValue, con);
cmd.ExecuteNonQuery();
क्योंकि आप अंत उपयोगकर्ता से फ़िल्टर नहीं की गई सामग्री का उपयोग कर रहे: लेकिन यदि आप नहीं करते हैं, उदाहरण के लिए आप नीचे दिए गए कुछ ऐसा करते हैं, आप खुली कर रहे हैं। एक बार फिर, उन्हें बस लाइन (";") को समाप्त करना है, उनके खतरनाक आदेश जोड़ें, और उछाल - आप को रोक दिया गया है।
(एक अलग रूप में, यदि आप वेब पर हैं, नहीं फ़िल्टर नहीं किए गए कबाड़ ब्राउज़र की क्वेरी स्ट्रिंग से लेते हैं -। यह मूर्खता अपने डेटा के लिए बेहद बुरा काम करने के लिए आसान बनाता है)
यदि आप प्रश्नों को पैरामीटर करते हैं, तो आप बहुत बेहतर आकार में हैं। हालांकि, जैसा कि अन्य लोगों ने यहां उल्लेख किया है, यदि आपकी proc अभी भी गतिशील एसक्यूएल उत्पन्न कर रही है और इसे निष्पादित कर रही है, तो अभी भी समस्याएं हो सकती हैं।
मुझे ध्यान रखना चाहिए कि मैं एंटी-प्रो नहीं हूं। डेटा एक्सेस के साथ कुछ समस्याओं को हल करने के लिए प्रक्रिया बहुत उपयोगी हो सकती है। लेकिन procs नहीं एक "एसक्यूएल इंजेक्शन के लिए चांदी गोली समाधान कर रहे हैं।
नहीं, क्योंकि आप अभी भी अपनी संग्रहीत प्रक्रियाओं में डी-एसक्यूएल का उपयोग कर सकते हैं ... और आपके इनपुट को मान्य और प्रतिबंधित करना किसी भी मामले में एक अच्छा विचार है।
यह निर्भर करता है कि आपकी संग्रहीत प्रोसेस क्या करती हैं। यदि वे गतिशील रूप से उनके पैरामीटर के आधार पर SQL उत्पन्न करते हैं, और फिर उस SQL को निष्पादित करते हैं, तो आप अभी भी कमजोर हैं। अन्यथा, आप ठीक होने की अधिक संभावना रखते हैं - लेकिन मुझे 100% आत्मविश्वास सुनने में संकोच नहीं है!
नहीं। यदि आप एसक्यूएल का निर्माण कर रहे हैं जो संग्रहीत प्रक्रिया को आमंत्रित करता है तो भी आप एक लक्ष्य हैं।
आपको ग्राहक पक्ष पर पैरामीकृत प्रश्न बनाना चाहिए।
प्रत्येक एसक्यूएल डेटाबेस में होना चाहिए। ग्राहकों को प्रश्न चलाने के लिए एक प्रक्रिया होनी चाहिए। किसी अन्य तरीके से इसका मतलब है कि डेटाबेस संरचना पर निर्भरता है कि वास्तुकार को अनजान है। आपकी वेबसाइट से आपकी पसंदीदा आरडीबीएमएस नहीं बता सका लेकिन यह ओरेकल –
@ मार्क की मजबूत सिफारिश है: यहां तक कि यदि सभी प्रश्न डेटाबेस में हैं, तो क्लाइंट ऐप को एक निष्पादन प्रक्रिया कथन चलाया जाना चाहिए। एसक्यूएल इंजेक्शन यहां हो सकता है, उदाहरण के लिए यदि आप प्रक्रिया के नाम के लिए अनुप्रयोग चर को इंटरपोलेट करते हैं। संग्रहीत प्रक्रियाओं के कहने के लिए –
यदि आप लगातार पैरामीटरयुक्त प्रश्नों का उपयोग करते हैं तो आप केवल SQL इंजेक्शन से प्रतिरक्षा हैं। आप लगभग एसक्यूएल इंजेक्शन से प्रतिरक्षा करते हैं यदि आप हर जगह उचित भागने का उपयोग करते हैं (लेकिन वहां से बचने वाले दिनचर्या में बग्स हो सकते हैं, और यह पैरामीटर के रूप में मूर्खतापूर्ण नहीं है)।
यदि आप एक संग्रहित प्रक्रिया को कॉल करते हैं, तो concatenation द्वारा तर्क जोड़ना, मैं अभी भी इनपुट फ़ील्ड के अंत में एक यादृच्छिक क्वेरी जोड़ सकता हूं - उदाहरण के लिए, यदि आपके पास CALL CheckLogin @username = '$ username' है, @password = '$ password', $ -things जो सीधे संयोजित चर का प्रतिनिधित्व करता है, कुछ भी मुझे $ पासवर्ड चर बदलने के लिए रोकता है, "ड्राप डेटाबेस; -"।
जाहिर है, यदि आप पहले से इनपुट को साफ करते हैं, तो यह एसक्यूएल इंजेक्शन को रोकने में भी योगदान देता है, लेकिन यह संभावित रूप से डेटा को फ़िल्टर कर सकता है जिसे साफ़ नहीं किया जाना चाहिए था।
+1 आपको एक पोस्टिंग पाखंड होने के लिए -100 सुरक्षित कर सकता है। – RandyMorris
@RandyMorris: मैं यह नहीं कह रहा हूं। मैं जो कह रहा हूं वह यह है कि, यदि आप एक संग्रहीत प्रक्रिया को बुला रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि यह सुरक्षित है या नहीं, जब तक कि आपका कॉल भी सुरक्षित न हो। दूसरे शब्दों में, * एसपीएस * का उपयोग करने के लिए पर्याप्त नहीं है क्योंकि आप अभी भी एसक्यूएल इंजेक्शन के लिए अतिसंवेदनशील हैं यदि आप एसपी को कॉन्सटेनेशन द्वारा कॉल करने के लिए क्वेरी बना रहे हैं, और यदि आप एसपी गतिशील क्वेरी बनाता है तो आप भी अतिसंवेदनशील होते हैं और इसे निष्पादित करता है यह उस टिप्पणी में मेरे बिंदु से अलग नहीं है जिस पर आप सोच रहे हैं: http: // stackoverflow।कॉम/प्रश्न/2768692/will-these-security-functions-be-enough-php/2768737 # 2768737 –
यह कहने की तरह है कि "पासवर्ड कहने के लिए डाउनवोट सुरक्षा में मदद करता है, यह केवल तभी काम करता है जब यह रिक्त न हो।" – RandyMorris
संग्रहित प्रक्रिया एक गारंटी है, क्योंकि वास्तव में असुरक्षित है किसी भी गतिशील कोड है नहीं कर रहे हैं, और कहा कि कोड के अंदर संग्रहित प्रक्रियाओं और संग्रहीत करने के लिए गतिशील रूप से उत्पन्न कॉल भी शामिल प्रक्रियाओं।
पैरामीटर्सिज्ड प्रश्न और पैरामीटर के साथ बुलाए गए संग्रहित प्रोसेस इंजेक्शन के लिए अनावश्यक हैं जब तक वे कोड उत्पन्न करने के लिए मनमानी इनपुट का उपयोग नहीं करते हैं। ध्यान दें कि बहुत सारे गतिशील कोड हैं जो इंजेक्शन के लिए भी कमजोर नहीं हैं (उदाहरण के लिए गतिशील कोड में पूर्णांक पैरामीटर)।
बड़े पैमाने पर लाभ (मुझे यकीन नहीं है कि 100% वास्तव में संभव है) संग्रहीत प्रोसेस-आधारित आर्किटेक्चर, हालांकि, यह है कि इंजेक्शन को क्लाइंट साइड पर गतिशील कोड के लिए कुछ हद तक बचाया जा सकता है (लेकिन पूरी तरह से नहीं) क्योंकि:
ऐप कनेक्ट होने वाले किसी भी उपयोगकर्ता संदर्भ के लिए केवल EXEC अनुमतियां दी जाती हैं, इसलिए कोई भी चयन, INSERT, अद्यतन, हटाएं प्रश्न विफल हो जाएंगे। बेशक, डीआरओपी आदि को वैसे भी अनुमति नहीं दी जानी चाहिए। तो किसी भी इंजेक्शन को EXEC के रूप में होना होगा, इसलिए आखिरकार, केवल आपके ऑपरेशन जो आपने अपनी एसपी परत में परिभाषित किया है, भी इंजेक्ट करने के लिए उपलब्ध होगा (मनमानी एसक्यूएल नहीं)।
संग्रहीत प्रक्रियाओं (जैसे सॉफ़्टवेयर में किसी भी अमूर्त परत की तरह) के रूप में अपनी डेटाबेस सेवाओं को परिभाषित करने के कई अन्य लाभों में से एक को ऐप्स को प्रभावित किए बिना आपके डेटाबेस को दोबारा करने की क्षमता है, बेहतर ढंग से समझने और उपयोग पैटर्न की निगरानी करने की क्षमता एक प्रोफाइलर के साथ अपने डेटाबेस में, और नए ग्राहकों को तैनात किए बिना डेटाबेस के भीतर चुनिंदा ऑप्टिमाइज़ करने की क्षमता।
इसके अतिरिक्त, अच्छी तरह से ग्रेनेड डेटाबेस एक्सेस का उपयोग करने पर विचार करें, (आमतौर पर रोल आधारित एक्सेस कंट्रोल भी कहा जाता है) आपके डेटाबेस के मुख्य उपयोगकर्ता को अपनी नौकरी करने के लिए बिल्कुल अनुमति की आवश्यकता होनी चाहिए और कुछ भी नहीं। स्थापित करने के बाद नई टेबल बनाने की जरूरत नहीं है? अनुमति दें कि अनुमति दें। Sysdba के रूप में चलाने की वैध आवश्यकता नहीं है? तो मत करो! उपयोगकर्ता को "ड्रोप डेटाबेस" को निर्देश देने के लिए एक स्नीकी इंजेक्शन को रोक दिया जाएगा यदि उपयोगकर्ता को उस अनुमति को अनुदान नहीं दिया गया है। फिर आपको डेटा-लीकिंग चयन कथन के बारे में चिंता करने की ज़रूरत है।
मैं संग्रहीत प्रक्रिया में ऐसा करने के लिए एक कारण के बारे में नहीं सोच सकता। जानना दिलचस्प है कि हालांकि यह किया जा सकता है। –
@अलेन: क्या आपका मतलब है कि आप एक संग्रहीत प्रक्रिया में गतिशील एसक्यूएल उत्पन्न करने का कोई कारण नहीं देख सकते हैं, या आप प्रक्रिया में दिए गए पैरामीटर का उपयोग करके संग्रहीत प्रक्रिया में गतिशील एसक्यूएल उत्पन्न करने का कोई कारण नहीं देख सकते हैं? –
@ माइकल ... क्लाइंट साइड लड़का होना चाहिए। डेटाबेस को अपने ऑब्जेक्ट्स के रिलेशनल प्रस्तुति को संग्रहीत करने के लिए बहुत सारी जगहों के साथ बस एक झाड़ू कोठरी के रूप में सोचता है .... हे –