2009-03-24 15 views
11

अगर मुझे सही याद है, तो मुझे लगता है कि जेफ ने एसक्यूएल तैयार बयानों में स्टैक ओवरफ्लो पॉडकास्ट में संभावित कमजोरी में उल्लेख किया है। मैं सोच रहा हूं कि किस प्रकार की कमजोरी (एस) ने इसका उल्लेख किया? क्या यह संभवतः लगभग inappropriate usage था, या कुछ और भयावह?तैयार बयानों के साथ एसक्यूएल इंजेक्शन?

पॉडकास्ट, मेरी याद करने के लिए, इस विषय में गहरी जाना नहीं था, यह सिर्फ एक पास-दर-टिप्पणी थी।

उत्तर

0

मैं पॉडकास्ट की बात सुनी नहीं किया है, लेकिन तैयार बयानों से मेरे अनुभव में ही अच्छा आता है। यह अक्सर एप्लिकेशन के प्रदर्शन में सुधार करता है और एसक्यूएल इंजेक्शन को रोकता है (यदि सही होता है, तो आपके लिंक में दूसरा उदाहरण नहीं है)।

1

बयान है कि तैयार किया जाता है मापदंडों गतिशील किसी भी तरह से निर्माण किया है, तो उस संभावना से भी अधिक कमजोरी का स्रोत हो सकता है है।

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

याद रखें, सिर्फ इसलिए कि एक बयान तैयार किया जाता है, या फिर आपने एक संग्रहीत प्रक्रिया का उपयोग कर रहे हैं, इसका मतलब यह नहीं है कि आप इंजेक्शन हमलों से सुरक्षित कर रहे हैं। यह केवल तभी होता है जब आप डेटाबेस प्रदाता कोड का उपयोग कर रहे हैं जो पैरामीटर के इनपुट को संचरित करेगा (साथ ही इसे सभी पैरामीटर पर लागू कर सकता है) जिसे आप SQL इंजेक्शन से सुरक्षा प्राप्त करते हैं।

2

सामान्य एसक्यूएल इंजेक्शन (जो हम पहले के आदेश कॉल कर सकते हैं) के अलावा हमला वहाँ माध्यमिक स्तर हैं। उदाहरण के लिए संग्रहीत प्रक्रियाओं को असामान्य नहीं करना एक क्वेरी बनाने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग करता है जो इसे तब निष्पादित करता है। यदि पुनर्प्राप्त फ़ील्ड मानों का परिणाम इस तरह के एक संयोजन में शामिल किया गया है तो इंजेक्शन का खतरा है।

6

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

उन्होंने यह भी फिर से मूल्यांकन करने के लिए निष्पादन की योजना बना रही है कि वह इस स्थिति पर काबू पाने के लिए प्रयोग किया जाता इंजन मजबूर करने के लिए एसक्यूएल सर्वर 2008 की एक नई सुविधा का उल्लेख किया।

तैयार वक्तव्य के साथ, मेरे पास एकमात्र मुद्दा यह है। पर विचार करें निम्नलिखित जावा कोड:

String sql = "select * from table where name like ?"; 
PreparedStatement pstmt = conn.prepareStatement(sql); 
pstmt.setString(1, "PATTERN%"); 
ResultSet rs = pstmt.executeQuery(); 

यहाँ आप कि उम्मीद करेंगे, अगर आप पर तालिका (नाम) एक सूचकांक है यह क्वेरी योजना द्वारा उपयोग किया जाएगा। अच्छा, यह नहीं होगा। क्योंकि पेपरडेस्टेटमेंट को प्रीकंपाइल करना चाहिए और सबसे खराब की अपेक्षा करना चाहिए: उदाहरण के लिए '% PATTERN%'। तो, यह अनुकूलित नहीं होगा। मुझे यह पता लगाने में थोड़ी देर लग गई। यह मेरे डेटाबेस को भुगतना पड़ा था। :(

आशा है कि यह मदद करता है।

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