खोज…


परिचय

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

एसक्यूएल इंजेक्शन का नमूना

अपने वेब एप्लिकेशन के लॉगिन हैंडलर को कॉल मानकर ऐसा लगता है:

https://somepage.com/ajax/login.ashx?username=admin&password=123

अब login.ashx में, आप ये मान पढ़ें:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

और यह निर्धारित करने के लिए अपने डेटाबेस को क्वेरी करें कि उस पासवर्ड वाला उपयोगकर्ता मौजूद है या नहीं।

तो आप एक SQL क्वेरी स्ट्रिंग बनाएँ:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

यदि उपयोगकर्ता नाम और पासवर्ड में कोई उद्धरण नहीं है तो यह काम करेगा।

हालाँकि, यदि किसी एक पैरामीटर में एक उद्धरण शामिल है, तो डेटाबेस को भेजा जाने वाला SQL इस तरह दिखाई देगा:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

यह एक सिंटैक्स त्रुटि में परिणाम होगा क्योंकि बाद बोली d में d'Alambert एसक्यूएल स्ट्रिंग समाप्त होता है।

आप उपयोगकर्ता नाम और पासवर्ड के उद्धरण से बचकर इसे सही कर सकते हैं, जैसे:

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

हालांकि, मापदंडों का उपयोग करना अधिक उपयुक्त है:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

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

उदाहरण के लिए, यदि कोई हमलावर दुष्ट है, तो वह पासवर्ड सेट करेगा

lol'; DROP DATABASE master; -- 

और फिर SQL इस तरह दिखाई देगा:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

दुर्भाग्य से आपके लिए, यह मान्य SQL है, और DB इसे निष्पादित करेगा!

इस प्रकार के शोषण को SQL इंजेक्शन कहा जाता है।

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

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

सरल इंजेक्शन नमूना

यदि SQL स्टेटमेंट इस तरह बनाया गया है:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

फिर एक हैकर आपके डेटा को pw' or '1'='1 जैसे पासवर्ड देकर पुनः प्राप्त कर सकता है; परिणामी SQL कथन होगा:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

यह Users तालिका में सभी पंक्तियों के लिए पासवर्ड चेक पास करेगा क्योंकि '1'='1' हमेशा सत्य होता है।

इसे रोकने के लिए, SQL पैरामीटर का उपयोग करें:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow