2010-12-02 12 views
31

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

क्या तैयार की गई स्थिति सुरक्षित है? और इसके अलावा इस कथन के साथ भी कोई समस्या होगी?

+1

तैयार बयानों जाने का रास्ता है। AFAIK एक तैयार कथन केवल एक बार पार्स किया जाएगा ताकि बाद की तारीख में एसक्यूएल इंजेक्शन का कोई मौका न हो। बेशक, आपको अभी भी एक्सएसएस हमलों, आदि के खिलाफ सुरक्षा के लिए इनपुट को स्वच्छ करने की आवश्यकता होगी। – CurtainDog

उत्तर

47

मनमाने ढंग से इनपुट से आपकी क्वेरी बनाने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग PreparedStatement सुरक्षित नहीं करेगा। इस उदाहरण पर एक नज़र डालें:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';"; 

किसी userName रूप

' or '1'='1 

डालता है, अपने PreparedStatement, एसक्यूएल इंजेक्शन के लिए असुरक्षित हो जाएगा, क्योंकि उस क्वेरी

SELECT * FROM users WHERE name = '' OR '1'='1'; 
के रूप में डेटाबेस पर निष्पादित किया जाएगा

इसलिए, यदि आप

preparedStatement = "SELECT * FROM users WHERE name = ?"; 
preparedStatement.setString(1, userName); 
का उपयोग

आप सुरक्षित रहेंगे।

इस कोड में से कुछ को this Wikipedia article से लिया गया।

+3

क्या सेटस्ट्रिंग कोई फर्क पड़ता है? यह वास्तव में क्या करता है? यहां तक ​​कि स्ट्रिंग इनस्थल को प्रतिस्थापित करने जा रहा है। यह कितना अलग बनाता है? –

+10

@ मोहम्मद: इससे कोई फर्क पड़ता है। क्वेरी '' चुनें * उपयोगकर्ताओं से जहां नाम =? "डेटाबेस को भेजा जाएगा जहां इसे संकलित किया गया है और फिर' setString' से 'userName' को प्रतिस्थापित किया जाएगा। यदि डेटाबेस एक अवैध मूल्य देखता है, तो यह एक त्रुटि फेंक देगा। इसलिए, '' या '1' = '1' को पूरी स्ट्रिंग के रूप में माना जाएगा, न कि ऑपरेटरों' या 'और' = 'से जुड़े बयान के रूप में। डेटाबेस इसे '' 'या' 1 '=' 1 '' के साथ एक स्ट्रिंग के रूप में देखेगा। – darioo

2

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

1

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

1

जैसा कि this article में बताया गया है, PreparedStatement अकेले ही आपकी मदद नहीं करता है यदि आप अभी भी स्ट्रिंग्स को संयोजित कर रहे हैं।

उदाहरण के लिए, एक बदमाश हमलावर अभी भी कर सकते हैं निम्नलिखित:

  • कॉल एक सोने समारोह ताकि आपके सभी डेटाबेस कनेक्शन व्यस्त हो जाएगा, इसलिए अपने आवेदन अनुपलब्ध
  • डीबी से संवेदनशील डेटा निकालने बनाने
  • bypassing the user authentication

और यह सिर्फ एसक्यूएल कि प्रभावित b कर सकते हैं नहीं है। यदि आप बाइंड पैरामीटर का उपयोग नहीं कर रहे हैं तो भी जेपीक्यूएल से समझौता किया जा सकता है।

नीचे पंक्ति, एसक्यूएल स्टेटमेंट बनाने के दौरान आपको स्ट्रिंग कॉन्सटेनेशन का कभी भी उपयोग नहीं करना चाहिए। उस उद्देश्य के लिए एक समर्पित एपीआई का उपयोग करें:

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