हम अपने कोड में पैराट्राइज्ड एसक्यूएल प्रश्नों का उपयोग करने के बारे में यहां एक और चर्चा कर रहे हैं। चर्चा में हमारे दो पक्ष हैं: मुझे और कुछ अन्य लोगों का कहना है कि हमें हमेशा sql इंजेक्शन से बचाव के लिए मापदंडों का उपयोग करना चाहिए और अन्य लोग जो यह नहीं सोचते कि यह आवश्यक है। इसके बजाय वे एसक्यूएल इंजेक्शन से बचने के लिए सभी तारों में दो एपोस्ट्रोफ के साथ एकल एपोस्ट्रोफ को बदलना चाहते हैं। हमारे डेटाबेस सभी Sql सर्वर 2005 या 2008 में चल रहे हैं और हमारा कोड आधार .NET फ्रेमवर्क 2.0 पर चल रहा है।
मैं आपको C # में एक सरल उदाहरण देता हूं:
मैं चाहता हूं कि हम इसका उपयोग करें:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
जबकि अन्य लोग ऐसा करना चाहते हैं:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
जहां SafeDBString फ़ंक्शन को निम्नानुसार परिभाषित किया गया है:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
अब, जब तक हम अपने प्रश्नों में सभी स्ट्रिंग मानों पर SafeDBString का उपयोग करते हैं, तब तक हमें सुरक्षित होना चाहिए। सही?
SafeDBString फ़ंक्शन का उपयोग करने के दो कारण हैं। पहला, यह वह तरीका है जो पत्थर की उम्र के बाद से किया गया है, और दूसरा, sql वक्तव्यों को डीबग करना आसान है क्योंकि आप डेटाबेस पर चलाई गई एक्सक्लूसिव क्वेरी को देखते हैं।
तो फिर। मेरा सवाल यह है कि क्या यह वास्तव में एसक्यूएल इंजेक्शन के हमलों से बचने के लिए सेफडबीएसट्रिंग फ़ंक्शन का उपयोग करने के लिए पर्याप्त है। मैं कोड के उदाहरण खोजने की कोशिश कर रहा हूं जो इस सुरक्षा उपाय को तोड़ता है, लेकिन मुझे इसका कोई उदाहरण नहीं मिल रहा है।
क्या कोई ऐसा व्यक्ति है जो इसे तोड़ सकता है? आपको इसे कैसे करना होगा?
संपादित करें: अब तक के उत्तरों को संक्षेप में प्रस्तुत करने के लिए:
- किसी को अभी तक Sql Server 2005 या 2008 पर SafeDBString के आसपास जाने का कोई रास्ता नहीं मिला है। यह अच्छा है, मुझे लगता है?
- कई उत्तरों ने बताया कि पैरामीट्रिक प्रश्नों का उपयोग करने पर आपको प्रदर्शन लाभ मिलता है। कारण यह है कि क्वेरी योजनाओं का पुन: उपयोग किया जा सकता है।
- हम यह भी मानते हैं कि पैराड्राइज्ड प्रश्नों का उपयोग करने से अधिक पठनीय कोड मिलता है जिसे बनाए रखना आसान होता है
- इसके अलावा सेफगबीएसट्रिंग के विभिन्न संस्करणों, स्ट्रिंग से नंबर रूपांतरण और स्ट्रिंग से डेट टू डेट का उपयोग करने की तुलना में पैरामीटर का उपयोग करना हमेशा आसान होता है।
- मापदंडों का उपयोग करके आप स्वचालित प्रकार का रूपांतरण प्राप्त करते हैं, कुछ ऐसा जो विशेष रूप से तब उपयोगी होता है जब हम तिथियों या दशमलव संख्याओं के साथ काम कर रहे होते हैं।
- और अंत में: अपने आप को सुरक्षा करने की कोशिश मत करो जैसा कि जूलियनआर ने लिखा था। डेटाबेस विक्रेता सुरक्षा पर बहुत समय और पैसा खर्च करते हैं। कोई ऐसा तरीका नहीं है जिससे हम बेहतर कर सकें और कोई कारण नहीं कि हमें उनका काम करने की कोशिश करनी चाहिए।
इसलिए जब कोई भी SafeDBString फ़ंक्शन की सरल सुरक्षा को तोड़ने में सक्षम नहीं था, तो मुझे बहुत सारे अन्य अच्छे तर्क मिले। धन्यवाद!