2009-03-26 16 views
13

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

वांछित व्यवहार है कि अगर की तरह

very nice;) DROP TABLE FOO;

जीयूआई कुछ में किसी प्रकार के डेटाबेस एक शाब्दिक स्ट्रिंग के रूप में यह इलाज और किसी भी तालिका छोड़ने के बिना सुरक्षित रूप से संग्रहीत करना चाहिए।

उत्तर

10

आप निश्चित रूप से PreparedStatement एस का उपयोग करना चाहते हैं। वे सुविधाजनक हैं। यहां एक example है।

5

आम तौर पर के बजाय, आप एक प्रश्न इनपुट श्रृंखलाबद्ध, लेकिन इसके बजाय PreparedStatement का उपयोग कर नहीं बनाना चाहिए।

इससे आपको यह निर्दिष्ट करने की सुविधा मिलती है कि आप अपनी क्वेरी के अंदर अपने पैरामीटर सेट कर रहे हैं, इसलिए जावा आपके लिए सभी इनपुट को स्वच्छ करने का ख्याल रखेगा।

3

तैयार की गई स्थिरता? हाँ बिल्कुल। लेकिन मुझे लगता है कि एक और कदम है: यूआई से इनपुट की वैधता और डेटाबेस के करीब आने से पहले वस्तुओं को बाध्यकारी।

मैं कहाँ बाध्यकारी PreparedStatement में एक स्ट्रिंग अभी भी आप एक एसक्यूएल इंजेक्शन हमले की चपेट में छोड़ सकता है देख सकते हैं:

String userInput = "Bob; DELETE FROM FOO"; 
String query = "SELECT * FROM FOO WHERE NAME = ?"; 

PreparedStatement ps = connection.prepareStatement(query); 
ps.setString(1, userInput); 
ps.executeQuery(); 

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

मैं इसे स्प्रिंग के बाध्यकारी एपीआई के साथ करने की अनुशंसा करता हूं।

+0

यह बिल्कुल सही प्रकार का हमला है कि तैयार बयान के खिलाफ सुरक्षा के लिए हैं। यह बच जाएगा; – danieltalsky

+0

तकनीकी रूप से तैयार किए गए स्टेटमेंट इंटरफ़ेस इसकी गारंटी नहीं देता है। यद्यपि यदि आपका चालक कुछ अलग करता है, तो एक नया विक्रेता ढूंढें। –

+0

@ डैनियल - मुझे इसे आजमाएं और खुद के लिए देखेंगे। चाहे मैं इसके बारे में सही हूं या नहीं, क्या आप इस बात से सहमत नहीं हैं कि सर्वर-साइड सत्यापन अभी भी एक अच्छा विचार है? – duffymo

3

आपका उपयोगकर्ता इनपुट वास्तव में "Bob'; delete from foo; select '" (या कुछ है कि तरह) तो निहित उद्धरण तैयार बयान से जोड़ा बंद कर दिया जाएगा करने के लिए होगा:

SELECT * FROM FOO WHERE NAME = 'Bob'; delete from foo; select '' 

लेकिन यदि आप ऐसा है कि तैयार बयान कोड बोली जाएगा अपने उद्धरण ताकि आप

SELECT * FROM FOO WHERE NAME = 'Bob''; delete from foo; select ''' 

का एक वास्तविक क्वेरी हो और आपके नाम "Bob', delete from foo; select '" के बजाय कई क्वेरी चलाने के रूप में जमा की जाएगी।

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