2012-01-30 8 views
16

से ऑर्डर "ऑर्डर" द्वारा एसक्यूएल इंजेक्शन को रोकें कुछ डेटा प्राप्त करने के लिए मैं एक एसक्यूएल क्वेरी बना रहा हूं :)
बेशक कुछ फ़िल्टरिंग और ऑर्डरिंग पार्ट्स हैं।भाग

परिणाम प्राप्त करने के लिए मैं "नामांकित पैरामीटर जेडीबीसी टेम्पलेट" का उपयोग करता हूं और जब मुझे "कहां" भाग में कुछ जोड़ने की आवश्यकता होती है, तो मैं इंजेक्शन को रोकने के लिए पैरामीटर मानचित्र का उपयोग करता हूं।

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

अब सॉर्टिंग के लिए प्रत्येक पैरामीटर कुछ वर्णों (जैसे ') को खाली स्ट्रिंग में बदलकर मैन्युअल रूप से बच निकला है, लेकिन हमारे नियम के लिए सेट किए गए कुछ पैरामीटर इस नियम को पारित करने के लिए थोड़ा जटिल हैं।

क्वेरी के भाग में एसक्यूएल इंजेक्शन को रोकने के लिए सबसे अच्छा तरीका क्या है, जब आप jdbc टेम्पलेट का उपयोग करते हैं?

+9

देखभाल के लिए +1 :) – RedFilter

+1

'तैयार किए गए स्टेटमेंट' का उपयोग करना संभव है? – Romain

+0

मुझे jdbc के बारे में पता नहीं है लेकिन ओरेकल में 'ऑर्डर बाय' में बाइंड वैरिएबल का उपयोग करना संभव है। – Ben

उत्तर

7

डेटाबेस तरफ एसक्यूएल इंजेक्शन के खिलाफ गार्ड की मदद करने के लिए, DBMS_ASSERT निर्मित Oracle पैकेज पर एक नजर है: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

आप अपने ORDER BY खंड के लिए SQL इंजेक्शन के खिलाफ की रक्षा में मदद मिलेगी SIMPLE_SQL_NAME समारोह मिल सकती है।

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

+0

यह शायद बेहतर है तो कस्टम एस्केपिंग फ़ंक्शन का उपयोग करें। अगर कुछ लाइब्रेरी (jdbctemplate या कुछ समान) के साथ ऐसा करने का कोई तरीका नहीं होगा, तो शायद यह ऐसा करेगा। – Dainius

1

एक तरह से मैं प्रयोग किया जाता है थोड़ा अलग कारणों के लिए ऑर्डर का उपयोग करने 3,2 (3 स्तंभ, दूसरे स्तंभ)

तो तक था, हालांकि यदि आप स्तंभ नाम के कॉलम में उपयोगकर्ता स्थिति द्वारा दर्ज पता लगा सकते हैं आउटपुट, संकेत इंजेक्शन वेक्टर को मारना चाहिए।

+0

समस्या यह है कि कभी कभी इस तरह क्षेत्र न केवल स्तंभ नाम शामिल है, लेकिन एक एसक्यूएल बयान – Dainius

+0

एक उपयोगकर्ता एसक्यूएल बयान दर्ज किए गए? –

+0

सीधे नहीं, कुछ लिंक में पैरामीटर होता है जिसे "ऑर्डर बाय" भाग में पास किया जाता है। फिक्स करने का पहला अनुमान अनुमत सॉर्ट फ़ील्ड का नक्शा बनाना था और यूआरएल के पैरामीटर द्वारा उस क्षेत्र को एक कुंजी के रूप में प्राप्त करें, विन्सेंट ने जो कुछ सुझाव दिया है (या वही)। लेकिन कुछ पुराने कोड भी हैं, कि मैं बहुत ज्यादा संशोधित नहीं करना चाहता (जो जानते हैं कि यह कितना समय तक जीवित रहेगा), और कुछ वर्ग है। और कुछ अन्य जगह हो सकती है जहां यह आदेश पैरामीटर उपयोग किया जाता है। – Dainius

2

आप सॉर्ट क्रम के चुनाव सीमित हो सकती है। अधिकांश एप्लिकेशन केवल उपयोगकर्ताओं को प्रदर्शित कॉलम द्वारा सॉर्ट करने देते हैं, उपयोगकर्ता अपने कॉलम प्लेस के माध्यम से किस कॉलम को सॉर्ट कर सकता है।

इस मामले में आप केवल उपयोगकर्ता से एक पूर्णांक स्वीकार करेंगे (आप अवरोही क्रम से क्रमबद्ध करने के लिए ऋणात्मक संख्या स्वीकार कर सकते हैं)। आप पूर्णांक की सूची स्वीकार करके उपयोगकर्ता को कई कॉलम द्वारा क्रमबद्ध करने दे सकते हैं।

इंटीजर जांचना आसान है और यह उपयोगकर्ता को अंतर्निहित कॉलम नामों का खुलासा नहीं करेगा।

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