2013-03-07 13 views
7

सबसे पहले, यह एक शैक्षिक प्रश्न है - कुछ ऐसा नहीं जो मैं उत्पादन अनुप्रयोग में लागू कर रहा हूं क्योंकि मैं सी # की मूल बातें सीख रहा हूं।एसक्यूएल क्रेडेंशियल सही ढंग से संग्रहीत

वर्तमान में मेरे पास एक समाधान है (वास्तव में 3, लेकिन एक इकाई परीक्षण है) परियोजनाएं;

  • फार्म
  • कक्षा लाइब्रेरी

कक्षा लाइब्रेरी के अंदर मैं एक वर्ग Database.cs कहा जाता है और यह एक MySQL डेटाबेस के साथ संचार। मैं सीधे इस Database.cs कक्षा के साथ संवाद नहीं करता, लेकिन कक्षा पुस्तकालय के अंदर अन्य कक्षाएं (उदाहरण के लिए Products.cs)। हालांकि, मुझे इस MySQL डेटाबेस से कनेक्ट करने के लिए प्रमाण-पत्र की आवश्यकता है और मुझे यकीन नहीं है कि इसे सुरक्षित तरीके से करने के लिए किस तरह से जाना है।

क्लास लाइब्रेरी के अंदर इसे संग्रहीत करना/कक्षा के अंदर प्रमाण-पत्रों को हार्ड-कोडिंग करना।

यह मुझे समझ में नहीं आता है क्योंकि उपयोगकर्ता आसानी से डीएलएल को पकड़ सकता है और उसे तकनीकी रूप से डेटाबेस में प्रमाण-पत्र मिलते हैं।

(जैसे Products.cs) एक वर्ग के लिए फार्म के माध्यम से साख दर्रा और उस वर्ग उस पर से गुजरता है डेटाबेस ऑब्जेक्ट

काम कर सके आरंभ करते हुए, की कोशिश की और यह काम करता है लेकिन मुझे यकीन है कि अगर यह है नहीं कर रहा हूँ ऐसा करने के लिए 'सबसे साफ' तरीका।

, एक स्थिर वर्ग कि साख

साथ गुण फिर शामिल लिखें अगर मैं कक्षा लाइब्रेरी के अंदर इस स्थैतिक कक्षा मेरा पहला उदाहरण के रूप में मैं एक ही बंद काफी हूं पैदा करते हैं। अगर मैं Form के अंदर इस स्थैतिक वर्ग को बनाउंगा, तो मुझे अपनी कक्षा पुस्तकालय से फॉर्म-प्रोजेक्ट का संदर्भ जोड़ने की आवश्यकता है (जिस तरह से मैं इसे बनना चाहता हूं)।

मैंने सामान को देखने की कोशिश की लेकिन मैं स्पष्ट रूप से यह सही नहीं कर रहा हूं। ऐसा करने के लिए कोई और रास्ता नहीं है?

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

@ जॉन सैंडर्स एसक्यूएल भी एक टैग है। – bas

+1

@bas: इस मामले में, यह एक विशेषण के रूप में इस्तेमाल किया जा रहा है। किस तरह के प्रमाण पत्र? ** एसक्यूएल ** प्रमाण पत्र। –

उत्तर

4

सबसे पहले कोड में कभी भी हार्ड-कोड प्रमाण-पत्र नहीं होते हैं क्योंकि क्रेडेंशियल्स समय के साथ बदलते हैं, इसका मतलब है कि प्रत्येक बार जब SQL क्रेडेंशियल्स बदलते हैं तो आपको अपने एप्लिकेशन को पुन: संकलित और पुन: नियोजित करना होगा।

आमतौर पर डेटाबेस से कनेक्ट करने के लिए आवश्यक सभी जानकारी connection string के रूप में अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल में संग्रहीत की जाती है।

यदि आपका आवेदन वेब एप्लिकेशन है तो आप जाने के लिए अच्छे हैं क्योंकि web.config (एक वेब एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल) वेब सर्वर पर संग्रहीत है और कभी भी वेब अनुरोधों पर सेवा नहीं की जाती है। लेकिन यदि आपका एप्लिकेशन विंडोज़ फॉर्म है, तो सुरक्षा विचारों का अर्थ यह है कि कोई भी उपयोगकर्ता जो आपके ऐप का उपयोग करता है, एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में देख सकता है और प्रमाण-पत्र प्राप्त कर सकता है। यदि यह माइक्रोसॉफ्ट एसक्यूएल होगा तो मैं विंडोज प्रमाणीकरण का उपयोग करने की सलाह दूंगा। लेकिन MySQL के साथ मुझे लगता है कि आप कनेक्शन स्ट्रिंग में उपयोगकर्ता नाम और पासवर्ड स्टोर करने के लिए बर्बाद हो गए हैं। तो मैं encrypting द्वारा अपनी कनेक्शन स्ट्रिंग को सुरक्षित करने का सुझाव दूंगा।
app.config:

इसके अलावा, अगर आपके उपयोगकर्ताओं कर सकते हैं/(MySQL उपयोगकर्ता नाम और पासवर्ड दर्ज करें) MySQL सर्वर के विरुद्ध प्रमाणित करने के लिए है, तो आप एक कनेक्शन स्ट्रिंग टेम्पलेट और उपयोगकर्ता नाम और पासवर्ड के साथ यह विकल्प कुछ भागों इस्तेमाल कर सकते हैं

<connectionStrings> 
    <add name="MyApplication" connectionString="Location=myServerAddress;Data Source=myDataBase;User ID={0};Password={1}; 
Port=3306;Extended Properties=""""; /> 
    </connectionStrings> 

सी # कोड

var username = textboxUsername.Text; 
var password = textboxPassword.Text; 

var connectionString = string.Format(ConfigurationManager.ConnectionStrings["MyApplication"].ConnectionString, username, password) 
// at this point you have a connection string whitch could be passed to your Products class 
1

वें के रूप में अपने क्रेडेंशियल्स को हार्डकोड न करें मुद्दों पर कारण साबित हो सकता है, सबसे पहले यदि आपको बाद में चरण में डेटाबेस में अपना लॉगिन क्रेडेंशियल बदलना होगा तो आपको अपनी कक्षा लाइब्रेरी को फिर से कंपाइल करना होगा, दूसरी बात यह है कि आप सुरक्षा का जिक्र करेंगे।

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

  1. जब आप अपने आवेदन की तैनाती, तैनात स्थान अपने विकास के वातावरण से एक अलग कनेक्शन क्रेडेंशियल
  2. आप के रूप में तो अपने विन्यास फाइल में कनेक्शन तार एन्क्रिप्ट कर सकते हैं हो सकता है:

    इस तरह आप 2 फायदे मिल सुरक्षा बढ़ाने के लिए

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