2010-06-28 19 views
7

मैं डेटाबेस कनेक्शन प्रारंभ करने के लिए निम्न कोड का उपयोग कर रहा:FindBugs और डेटाबेस पासवर्ड सुरक्षा समस्या


public Connection getConnection() { 
     try { 
      if (null == connection) { 
       String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver 
       Class.forName(driverName); 

       // Create a connection to the database 
       String serverName = "localhost"; 
       String database = "database"; 
       String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url 
       String username = "username"; 
       String password = "password"; 
       connection = DriverManager.getConnection(url, username, password); 
      } 
      return connection; 
     } catch (ClassNotFoundException cnfe) { 
      cnfe.printStackTrace(); 
     } catch (SQLException sqle) { 
      sqle.printStackTrace(); 
     } 
     throw new NullPointerException("Cannot establish database connection..."); 
    } 

और मैं जानता हूँ कि यह बुरा व्यवहार है यह करने के लिए, यह भी मैं कोड के खिलाफ FindBugs भाग गया, और सुरक्षा मिल गया निम्नलिखित कहने का मुद्दा: This code creates a database connect using a hardcoded, constant password. Anyone with access to either the source code or the compiled code can easily learn the password.

इस सुरक्षा उल्लंघन के बिना डेटाबेस कनेक्शन प्रारंभ करने का सबसे अच्छा तरीका क्या है?

उत्तर

1

वेब अनुप्रयोग के विशाल बहुमत उनके एसक्यूएल कनेक्शन के लिए एक हार्ड-कोडेड उपयोगकर्ता नाम/पासवर्ड का उपयोग करें:

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

वेब अनुप्रयोगों के लिए उनकी कॉन्फ़िगरेशन फ़ाइलों को रिसाव करना आम बात है। उदाहरण के लिए यदि वेबलॉट में .xml फ़ाइल संग्रहीत की जाती है तो इसे दूरस्थ रूप से एक्सेस किया जा सकता है: http://localhost/configs/db_config.xml

यह अपने डेटाबेस (mysql के लिए ब्लॉक TCP पोर्ट 3306) के लिए उपयोग की अनुमति रद्द करने आम बात है। वास्तव में यह पीसीआई-डीएसएस की आवश्यकता है। भले ही उपयोगकर्ता नाम और पासवर्ड प्राप्त किया जाए, यह बेकार होगा।

+0

यदि आपके पास आपकी कंपनी में एक से अधिक डेवलपर हैं तो यह वास्तव में एक मुद्दा है। ** उत्पादन ** पासवर्ड ** सुरक्षित वातावरण के लिए सभी डेवलपर्स को ** उपलब्ध नहीं होना चाहिए। स्रोत कोड आमतौर पर एकाधिक सिस्टम पर फैलता है: एससीएम, सीआई, डेस्कटॉप कंप्यूटर, आदि अन्य उत्तरों देखें। – h3xStream

+1

@ h3xStream बिल्कुल सही है। यह पोस्ट बहुत पुरानी है, मुझे माफ़ कर दो। – rook

+0

मैं एक संपादन के लिए पूछने जा रहा था .. और फिर देखा कि आपने पहले से ही किया है। +1 – h3xStream

2

एक गुण से पासवर्ड पढ़ें केवल सॉफ्टवेयर (जो डेवलपर्स में से कोई भी तक पहुंच होनी चाहिए) को चलाने के लिए प्रयोग किया जाता है खाते में उन लोगों के लिए या LDAP या इसी तरह के और सुरक्षित फ़ाइल पहुंच।

+0

विशिष्ट होने के लिए: सिस्टम प्रॉपर्टी का उपयोग न करें क्योंकि -D विकल्प किसी भी व्यक्ति को दिखाई देगा जो मशीन पर सक्रिय प्रक्रियाओं को सूचीबद्ध कर सकता है। –

+0

डेवलपर को एक पिछवाड़े लिखने से रोकना क्या है? इस मामले में एक जानबूझकर एसक्यूएल इंजेक्शन भेद्यता। – rook

+0

@rook कोड डेवलपर्स और सुरक्षा लेखा परीक्षकों द्वारा लेखा परीक्षा किया जा सकता है। समस्या सिर्फ डेवलपर्स दुर्भाग्य ही नहीं बल्कि एक डेवलपर यूएसबी कुंजी खो रहा है या उसके डेस्कटॉप से ​​समझौता किया गया है। – h3xStream

2

डेटाबेस गुणों को संग्रहीत करने के लिए सरल फ़ाइलों का उपयोग करें और उन्हें हार्डकोडिंग के बजाय कोड में पढ़ें। न केवल यह साफ है बल्कि आप फ़ाइल पहुंच को प्रतिबंधित भी कर सकते हैं।

यह link आपकी मदद कर सकता है।/DPAPI का उपयोग कर आप Windows बॉक्स का उपयोग कर रहे हैं फ़ाइल के वर्गों

+0

यदि आप इसे एन्क्रिप्ट करते हैं, तो आप कुंजी कहां जा रहे हैं? – rook

+0

@rook: आप नहीं कर सकते। फ़ाइल में "सेव" पासवर्ड को सहेजने का कोई तरीका नहीं है यदि आपको इसे सर्वर के तरफ स्पष्ट टेक्स्ट में ट्रांसमिट करने की आवश्यकता है और नहीं चाहते कि उपयोगकर्ता पास वाक्यांश या कुछ दर्ज करे। आप केवल इसे खराब कर सकते हैं। यदि सर्वर हालांकि शेड पासवर्ड स्वीकार करता है तो आप केवल हैश स्टोर कर सकते हैं। –

0

आप एक कॉन्फ़िग फ़ाइल में पासवर्ड स्टोर कर सकते हैं और फिर फ़ाइल को एन्क्रिप्ट। इस तरह, आपको भी महत्वपूर्ण प्रबंधन के बारे में चिंता करने की आवश्यकता नहीं होगी।

1

इस कोड को एक डेटाबेस एक हार्डकोडेड, निरंतर पासवर्ड का उपयोग कर कनेक्ट पैदा करता है। ।

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

आप अपने डीबी uesrname और पासवर्ड को शामिल करने के लिए गुणों का उपयोग कर सकते हैं जिसके साथ आप setproperty() विधि का उपयोग कर गुण ऑब्जेक्ट में एन्कोड कर सकते हैं।

conn = DriverManager(url, properyObject); 
संबंधित मुद्दे