2008-12-29 11 views
5

मैंने अभी ग्रहण के लिए FindBugs प्लगइन स्थापित किया है, उम्मीद है कि यह मुझे मेरे कोड में SQL इंजेक्शन भेद्यता खोजने में मदद करेगा।Findbugs संभावित SQL इंजेक्शन भेद्यता नहीं ढूंढ रहे

सार्वजनिक स्थिर अंतिम स्ट्रिंग staticFinalBaseQuery = "से foo का चयन करें: हालांकि, यह कुछ भी खोजने हो सकता है, यहां तक ​​कि जब मैं जानबूझ कर में कुछ डाल दिया, मान staticFinalBaseQuery घोषित किया जाता है इस प्रकार है प्रतीत नहीं होता

निम्नलिखित उदाहरण में। टेबल जहां आईडी = '";

और मान लें कि userInputfilterString उदाहरण स्निपेट को लपेटने की विधि के लिए एक तर्क है। यह उपयोगकर्ता इनपुट से सीधे आता है, और sanitized नहीं है।

String query = staticFinalBaseQuery + userInputfilterString; 
pstmt = dbConnection.prepareStatement(query); 

कहाँ staticFinalBaseQuery एक स्थिर अंतिम स्ट्रिंग है, और userInputfilterString उपयोगकर्ता इनपुट से एक स्ट्रिंग प्रत्यक्ष, उपलब्ध केवल रनटाइम पर, सब पर झाड़ी नहीं है:

उदाहरण के लिए, निम्नलिखित स्निपेट एक चेतावनी ट्रिगर नहीं करेगा । जाहिर है, यह एक भेद्यता है।

मुझे उम्मीद है कि "A prepared statement is generated from a nonconstant String" चेतावनी को ट्रिगर किया जाएगा।

निम्नलिखित स्निपेट भी (के बाद से इनमें से संकलित रूपों शायद समान हैं, आश्चर्य की बात नहीं) एक चेतावनी का कारण नहीं है:

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'"); 

:

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString); 

बहरहाल, यह एक चेतावनी का कारण होगा अगर मैं खाली स्ट्रिंग या स्पेस जोड़ता हूं, तो कोई चेतावनी ट्रिगर नहीं होती है।

तो, मेरा प्रश्न है, मैं अपने पहले उदाहरण पर ट्रिगर करने के लिए FindBugs कैसे प्राप्त कर सकता हूं? मैं भी उत्सुक हूं क्यों पहला चेतावनी नहीं देता है, लेकिन आखिरी करता है?

अग्रिम धन्यवाद!

EDIT: Isubmitted a bug FindBugs की बग ट्रैकिंग सिस्टम में, जैसा कि ऐसा लगता है कि यह एक बग हो सकता है। हालांकि, अगर किसी के पास कोई सुझाव है, तो मुझे उन्हें सुनना अच्छा लगेगा।

+0

शायद आपको इसे FindBugs लोगों को बग के रूप में रिपोर्ट करना चाहिए? –

+0

हाँ, शायद मुझे चाहिए। मैंने सोचा कि शायद मैं इसे गलत इस्तेमाल कर रहा था। यदि ऐसा है, तो वे दस्तावेज़ीकरण को अपडेट करना चाहेंगे। – pkaeding

+0

क्या आप पोस्ट कर सकते हैं कि वास्तव में staticFinalBaseQuery और userInputfilterString कैसे प्रारंभ किए गए हैं? –

उत्तर

2

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

असल में, यह एक बग नहीं है, लेकिन सॉफ़्टवेयर द्वारा SQL इंजेक्शन की जांच करने के लिए कितना किया जा सकता है इसकी एक सीमा। चूंकि स्ट्रिंग में कुछ भी हो सकता है (यानी यह किसी अन्य फ़ंक्शन में कमजोर संगतता हो सकता है) यह सुनिश्चित करना असंभव है कि टूल किसी निश्चितता के साथ निर्धारित करता है कि कोई समस्या मौजूद है।

+0

मैंने अभी प्रश्न को राज्य में संपादित किया है, जिसकी जांच करें कि मुझे ट्रिगरबग ट्रिगर करने की उम्मीद है, और मैंने क्यों सोचा कि इसे मेरे स्निपेट को संभावित बग के रूप में दिखाना चाहिए। – pkaeding

+0

मैं ज्यादातर इस उत्तर से सहमत हूं, लेकिन तैयारी के लिए कॉल में निश्चित रूप से एक गैर-निरंतर संगतता हो रही है, इसलिए मैं भी चेक को ट्रिगर करने की अपेक्षा करता हूं। –

1

मुझे नहीं लगता कि PMD या Checkstyle इसे पकड़ लेगा, लेकिन आप उन्हें एक कोशिश दे सकते हैं (मैं नियमित रूप से सभी 3 का उपयोग करता हूं, उपयोग करने के लिए अच्छे उपकरण)।

संपादित करें: PMD सही लिंक था, लेकिन मैं यह FindBugs मस्तिष्क मुझे लगता है पर बुलाया ... FindBugs ...

0

ऐसे http://www.ouncelabs.com/ जो अपने उद्देश्य में काफी बेहतर सेवा करेंगे के रूप में वाणिज्यिक सॉफ्टवेयर के उन्नयन पर विचार करें ..

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