Last chance! 50% off DataCamp Premium
Sale ends in
SQL इंजेक्शन (या संक्षेप में SQLi) हैकरों की सबसे पुरानी तरकीबों में से एक है, लेकिन यह अब भी बेहद आम और बेहद खतरनाक है। संक्षेप में, यह डेटाबेस को वे चीज़ें उजागर करने के लिए बहकाने के बारे में है जो उसे नहीं करनी चाहिए।
इस लेख में, मैं आपको बताऊँगा कि वास्तव में SQL इंजेक्शन क्या है, हमलावर इसे किन-किन तरीकों से इस्तेमाल करते हैं, कुछ वास्तविक उदाहरण जिनसे गंभीर नुकसान हुआ, और शायद सबसे महत्वपूर्ण—आप इसे कैसे रोक सकते हैं। चाहे आप डेवलपर हों या बस यह जानने के इच्छुक हों कि इंटरनेट पर चीज़ें कैसे टूटती हैं, आप SQLi को अच्छी तरह समझ कर निकलेंगे (वह भी बिना आधे में ऊँघे, वादा है)।
SQL इंजेक्शन एक ऐसा हमला है जब कोई आपके ऐप द्वारा डेटाबेस को भेजी जाने वाली SQL क्वेरीज़ के साथ छेड़छाड़ करने का तरीका ढूँढ लेता है। सामान्यतः, ये क्वेरीज़ यूज़र प्रोफाइल लाने या किसी प्रोडक्ट लिस्टिंग को अपडेट करने जैसे काम करती हैं। लेकिन SQLi में, हमलावर आपके इनपुट फ़ील्ड्स (जैसे सर्च बार या लॉगिन फ़ॉर्म) में खतरनाक SQL कोड इंजेक्ट कर सकता है, और अचानक डेटाबेस वही करने लगता है जो वे चाहते हैं।
क्योंकि कहीं न कहीं एप्लिकेशन यूज़र इनपुट पर ज़्यादा भरोसा कर रहा होता है, और उसे संभावित निष्पाद्य कोड की बजाय हानिरहित टेक्स्ट समझ लेता है। यह वैसा ही है जैसे किसी को फ़ॉर्म भरने दें और फिर उन्होंने जो लिखा उसे सीधे कमांड कंसोल में पेस्ट कर दें।
SQL इंजेक्शन खतरनाक है क्योंकि इसका इस्तेमाल निजी डेटा (जैसे यूज़रनेम, पासवर्ड या क्रेडिट कार्ड जानकारी) देखने या चुराने, लॉगिन स्क्रीन बायपास करने, डेटा हटाने या बदलने, और सबसे बुरे हालात में पूरे डेटाबेस सर्वर पर नियंत्रण पाने तक के लिए किया जा सकता है।
तो हाँ, SQLi बुरा है—और यह कोई नया सुरक्षा मुद्दा भी नहीं—फिर भी आप यह देख कर चौंक जाएंगे कि कितने ऐप्स इसके खिलाफ ठीक से सुरक्षित नहीं हैं।
हमलावर आपके ऐप के साथ कैसे इंटरैक्ट करता है और उसे कैसा फीडबैक मिलता है, इस पर निर्भर करते हुए SQLi के कुछ अलग-अलग रूप होते हैं। आमतौर पर 3 प्रमुख प्रकार मिलते हैं:
यह सबसे सीधा प्रकार है। हमलावर एक दुर्भावनापूर्ण SQL क्वेरी भेजता है और परिणाम सीधे एप्लिकेशन के जरिए वापस मिल जाते हैं। यह तेज़ और अक्सर बहुत प्रभावी होता है।
एरर-आधारित SQLi: यह तकनीक डेटाबेस द्वारा लौटाए गए एरर मैसेज पर निर्भर करती है। ये एरर बहुत उपयोगी जानकारी उजागर कर सकते हैं, जैसे टेबल नाम या क्वेरी की संरचना, जिससे हमलावर के लिए अगला कदम प्लान करना आसान हो जाता है।
यूनियन-आधारित SQLi: यहाँ हमलावर UNION ऑपरेटर का इस्तेमाल कर अपनी क्वेरी को आपकी ऐप की क्वेरी के साथ जोड़ देता है। यह डेटाबेस से अतिरिक्त डेटा खींचकर प्रतिक्रिया में घुसेड़ने का चतुर तरीका है।
यह थोड़ा और चोरी-छिपे होता है। अपनी क्वेरी के नतीजे सीधे देखने के बजाय, हमलावर एप्लिकेशन के व्यवहार को देखकर अंदाज़ा लगाता है कि अंदर क्या हो रहा है।
WAITFOR DELAY '00:00:05') और प्रतिक्रिया समय का उपयोग करके अनुमान लगाया जाता है कि कोई शर्त सही है या नहीं।यह कम आम है, लेकिन जानना ज़रूरी है। आउट-ऑफ-बैंड SQLi ऐप से मिलने वाले तत्काल जवाबों पर निर्भर नहीं करता। इसकी बजाय, हमलावर DNS या HTTP रिक्वेस्ट जैसे वैकल्पिक चैनल का उपयोग कर डेटा निकालता है। यह आमतौर पर तब किया जाता है जब सीधा फीडबैक संभव नहीं होता, लेकिन डेटाबेस सर्वर को इंटरनेट एक्सेस होता है (और 90% मामलों में, उसे नहीं होना चाहिए)।
ठीक है, हमने SQL इंजेक्शन के 3 प्रकार देख लिए। लेकिन व्यावहारिक तौर पर हमलावर यह करते कैसे हैं?
यह क्लासिक है। एक लॉगिन फ़ॉर्म की कल्पना करें जहाँ आपको यूज़रनेम और पासवर्ड दर्ज करना है। हमलावर कुछ ऐसा दर्ज कर सकता है:
' OR 1=1 --
SQL क्वेरी कुछ इस तरह दिखने लगती है:
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';
चूँकि 1=1 हमेशा सत्य होता है, डेटाबेस सभी यूज़र्स लौटा देता है, और -- बाकी क्वेरी को कमेंट में बदल देता है। यदि कोई लिमिट लागू नहीं है, तो हमलावर बिना वैध यूज़रनेम जाने भी लॉगिन हो सकता है।

स्रोत: vmware
ऊपर देखा ही, -- या /* */ कैरेक्टर का इस्तेमाल SQL स्टेटमेंट के हिस्से को कमेंट करने के लिए होता है। हमलावर इसका उपयोग उन अतिरिक्त खंडों को हटाने के लिए करते हैं जो उनके इंजेक्ट किए गए पेलोड को बिगाड़ सकते हैं। उदाहरण के लिए, यदि उन्हें मूल क्वेरी की पूरी संरचना नहीं पता, तो वे उसे यहीं काटकर फिर से सिंटैक्स के लिहाज से वैध बना सकते हैं।
कुछ डेटाबेस एक ही रिक्वेस्ट में सेमीकोलन से अलग कई SQL स्टेटमेंट चलाने की अनुमति देते हैं। यदि एप्लिकेशन इसे सीमित नहीं करता, तो हैकर्स इस सुविधा से डेटा बदलने या टेबल्स ड्रॉप करने तक का नुकसान कर सकते हैं।
'; DROP TABLE users; --
एक UNION SELECT स्टेटमेंट इंजेक्ट करके, हमलावर अपनी दुर्भावनापूर्ण क्वेरी को वैध क्वेरी के साथ जोड़ सकता है और अन्य टेबलों से नतीजे ला सकता है—जैसे संवेदनशील यूज़र डेटा, पासवर्ड, या क्रेडिट कार्ड जानकारी। मूलतः यह किसी मौजूदा क्वेरी का इस्तेमाल बोनस डेटा पाने के लिए है।
यह पहले भी उल्लेखित है। भले ही ऐप एरर न दिखाए या क्वेरी नतीजे न लौटाए, हमलावर व्यवहार का निरीक्षण करके धीरे-धीरे डेटा निकाल सकता है। यह धीमा और थकाऊ है, लेकिन काम करता है। अक्सर ऐसे टूल से स्वचालित किया जाता है जो सैकड़ों क्वेरी और टाइम-आधारित प्रतिक्रियाएँ आज़मा सकते हैं।
दुर्भावनापूर्ण SQL को डेटाबेस में सेव कर दिया जाता है, जैसे किसी यूज़र प्रोफ़ाइल या कमेंट में, और बाद में जब कोई वह डेटा देखता है तो यह निष्पादित हो जाता है।
SQL इंजेक्शन कोई निच हैकर चीज़ नहीं लगती—लेकिन सालों में इसने बहुत वास्तविक नुकसान किए हैं। और नुकसान से मेरा मतलब है—लाखों यूज़र रिकॉर्ड उजागर, भारी जुर्माने, और ऐसी हेडलाइंस जिनसे मार्केटिंग टीमों को कोई फायदा नहीं हुआ।
यह शुरुआती उदाहरण है जिसने लोगों को सचेत किया। एक सुरक्षा शोधकर्ता ने SQL इंजेक्शन की खामी का फायदा उठाकर 200,000 से अधिक ग्राहकों के रिकॉर्ड—क्रेडिट कार्ड विवरण सहित—तक पहुँच हासिल कर ली। अच्छी बात यह रही कि इसे एक एथिकल हैकर ने खोजा और रिपोर्ट किया।
यह एक विशाल उल्लंघन था जिसने एक पेमेंट प्रोसेसर को प्रभावित किया और 130+ मिलियन क्रेडिट कार्ड नंबर चोरी हुए। हमलावरों ने SQL इंजेक्शन से शुरुआती घुसपैठ की और फिर वहाँ से आगे बढ़े। इसे अक्सर अब तक के सबसे बड़े डेटा उल्लंघनों में गिना जाता है।
हमलावरों ने UNION-आधारित SQL इंजेक्शन की खामी का फायदा उठाया और 450,000 यूज़रनेम और सादे-टेक्स्ट पासवर्ड उजागर कर दिए। हाँ, आपने सही पढ़ा—साफ़-साफ़ टेक्स्ट में रखी क्रेडेंशियल्स। यह उल्लंघन खासा शर्मनाक था क्योंकि Yahoo! एक बड़ी टेक कंपनी थी, और अनएन्क्रिप्टेड पासवर्ड स्टोर करना 2012 के मानकों से भी एक बड़ा “डोंट” था।
TalkTalk, एक हाई-प्रोफ़ाइल यूके टेलीकॉम प्रोवाइडर, एक काफ़ी बुनियादी SQL इंजेक्शन हमले का शिकार हुआ। लगभग 157,000 ग्राहक रिकॉर्ड से समझौता हुआ, और कंपनी पर £400,000 का जुर्माना लगा। हमलावरों में से एक सिर्फ़ 17 साल का था।
हैक्टिविस्ट्स ने SQL इंजेक्शन का उपयोग करके 70GB डेटा बाहर निकाला, जिसमें निजी पोस्ट और हैश किए गए पासवर्ड शामिल थे। यह उल्लंघन राजनीतिक रूप से संवेदनशील था, और इसके बाद Gab की समग्र सुरक्षा स्थिति पर और भी सवाल उठे।
ठीक है, अब जब हमने वास्तविक दुनिया के उल्लंघनों से खुद को थोड़ा डरा लिया है, तो समाधान की बात करें। अच्छी खबर यह है कि SQL इंजेक्शन को रोकना रॉकेट साइंस नहीं है। अधिकतर मामलों में, यह यूज़र इनपुट पर भरोसा न करने और सर्वोत्तम प्रक्रियाओं पर टिके रहने की बात है। आप यह कर सकते हैं:
यह नियम नंबर एक है। कभी भी स्ट्रिंग्स जोड़कर SQL क्वेरी न बनाएँ। इसके बजाय, प्लेसहोल्डर का उपयोग करें और यूज़र इनपुट को पैरामीटर के रूप में पास करें। अधिकतर फ़्रेमवर्क और लाइब्रेरी यह काम बहुत आसान बना देते हैं।
उदाहरण के लिए Node.js में pg (PostgreSQL) के साथ:
client.query('SELECT * FROM users WHERE id = $1', [userId]);
यह मूलतः डेटाबेस से कहता है, “यह रही क्वेरी की संरचना, और यह रहा डेटा—कृपया इन्हें आपस में न मिलाएँ।”
Stored procedures मददगार हो सकती हैं, बशर्ते वे डायनेमिक SQL से बचें। विचार यह है कि SQL लॉजिक डेटाबेस में रहे और आपका ऐप उन्हीं सुरक्षित, पूर्व-परिभाषित लॉजिक ब्लॉक्स को कॉल करे।
यदि आप फ़ंक्शंस और स्टोर्ड प्रोसिजर बनाना, अपडेट करना और चलाना सीखना चाहते हैं, तो हमारा Writing Functions and Stored Procedures in SQL Server कोर्स देखें।
यदि आपका ऐप किसी संख्या की अपेक्षा करता है, तो सुनिश्चित करें कि वह संख्या ही हो। यूज़र जो भी दे, उसे आँख मूँदकर स्वीकार न करें। जहाँ संभव हो, टाइप चेक, लंबाई सीमा, और अलाउलिस्ट (यानी सिर्फ़ ज्ञात अच्छे मानों की अनुमति) का उपयोग करें।
कैरक्टर एस्केपिंग (जैसे कोट्स) भी मदद कर सकती है, लेकिन यह पैरामीटराइज़्ड क्वेरी का विकल्प नहीं है।
WAF ज्ञात अटैक पैटर्न के खिलाफ पहली सुरक्षा-रेखा की तरह काम कर सकता है। यह कुछ दुर्भावनापूर्ण ट्रैफ़िक को आपकी ऐप तक पहुँचने से पहले ही ब्लॉक करने में मदद कर सकता है। यह अचूक नहीं है लेकिन उपयोगी है—कुछ-कुछ आपके SQL के लिए स्पैम फ़िल्टर जैसा।
आपका वेब ऐप डेटाबेस से एडमिन अधिकारों के साथ कनेक्ट नहीं होना चाहिए। हर यूज़र या सर्विस क्या कर सकती/सकता है, इसे सीमित करें। उदाहरण के लिए, यदि आपके ऐप को सिर्फ़ डेटा पढ़ना है, तो उसे टेबल डिलीट करने की अनुमति न दें। उसके पास जितनी कम शक्ति होगी, इंजेक्शन उतना ही कम नुकसान कर पाएगा।
चाहे आपको लगे कि आपका कोड सुरक्षित है, फिर भी उसे हमलावर की तरह टेस्ट करना फायदेमंद है। SQL इंजेक्शन अक्सर दरारों से फिसल जाता है, खासकर बड़े कोडबेस या लेगेसी सिस्टम में। ऐसे टूल और तकनीकें उपलब्ध हैं जो डिटेक्शन को आसान बनाती हैं—और इनके साथ खेलना काफ़ी मजेदार भी हो सकता है।
कभी-कभी छेद ढूँढने का सबसे तेज़ तरीका है उसे हल्के से कुरेदना। फ़ॉर्म फ़ील्ड्स, URLs या अन्य इनपुट जगहों पर ' OR 1=1 -- या '; DROP TABLE users; -- दर्ज करके देखें कि ऐप कैसे प्रतिक्रिया देती है। यदि अजीब एरर, अप्रत्याशित डेटा, या रहस्यमयी सफल संदेश मिलें, तो संभव है आपने कुछ संदिग्ध पकड़ लिया हो।
प्रो टिप: हमेशा डेवलपमेंट या स्टेजिंग वातावरण में ही टेस्ट करें।
ऐसे बहुत से टूल हैं जो आपके लिए यह कुरेद-परख कर देंगे। कुछ अच्छे विकल्प:
ये टूल हमलों का सिमुलेशन करते हैं, संभावित इंजेक्शन पॉइंट चिह्नित करते हैं, और कभी-कभी सुधार के सुझाव भी देते हैं।
एक और कारगर तरीका: अपने डेटाबेस लॉग मॉनिटर करें। बार-बार असफल क्वेरी, अजीब सिंटैक्स पैटर्न, या ', --, या UNION SELECT जैसी चीज़ों वाले रिक्वेस्ट का उछाल—ये सभी रेड फ़्लैग हैं।
SQL इंजेक्शन अभी कहीं नहीं जा रहा—और यह उन खतरों में से एक है जो कभी पुराने नहीं पड़ते। यह सरल है, शक्तिशाली है, और यदि आप सावधान नहीं हैं तो गंभीर नुकसान कर सकता है। बात यह है कि SQLi पूरी तरह से टालने योग्य है। पैरामीटराइज़्ड क्वेरी का उपयोग करके, इनपुट वैलिडेट करके, न्यूनतम विशेषाधिकार सिद्धांत अपनाकर, और नियमित रूप से परीक्षण करके, आप अपनी एप्लिकेशंस और उपयोगकर्ताओं को SQL इंजेक्शन हमले के विनाशकारी प्रभाव से बचा सकते हैं।
याद रखें, कोई भी पूर्णता की उम्मीद नहीं करता, लेकिन थोड़े से प्रैक्टिव प्रयास से आप अपने डेटाबेस को सुरक्षित रख सकते हैं और अपनी सुरक्षा चेकलिस्ट से इसे टिक कर सकते हैं। और यदि आप SQL को लेकर गंभीर हैं और संभावित नियोक्ताओं के सामने अपने कौशल दिखाना चाहते हैं, तो हमारा SQL Associate Certification देखें! यह दिखाएगा कि आप डेटाबेस से उपयुक्त डेटा निकालने और आम डेटा प्रश्नों के उत्तर देने के लिए SQL का उपयोग करने में सक्षम हैं।

मैं एक प्रोडक्ट-उन्मुख टेक लीड हूं, जो शुरुआती चरण के स्टार्टअप्स को पहले प्रोटोटाइप से लेकर प्रोडक्ट–मार्केट फिट और उससे आगे तक बढ़ाने में विशेषज्ञता रखता/रखती हूं। मुझे यह जानने में गहरी दिलचस्पी है कि लोग तकनीक का उपयोग कैसे करते हैं, और मुझे संस्थापकों व क्रॉस-फ़ंक्शनल टीमों के साथ मिलकर साहसिक विचारों को साकार करना पसंद है। जब मैं प्रोडक्ट नहीं बना रहा/रही होता/होती, तब मैं दुनिया के नए कोनों में प्रेरणा की तलाश में रहता/रहती हूं या योग स्टूडियो में जाकर मन हल्का करता/करती हूं।
पारंपरिक SQL इंजेक्शन MongoDB जैसी NoSQL डेटाबेस पर काम नहीं करता, लेकिन यदि इनपुट ठीक से सैनिटाइज़ नहीं किए गए हों तो समान इंजेक्शन-शैली के हमले हो सकते हैं (जैसे डॉक्यूमेंट इंजेक्शन या क्वेरी में हेरफेर)।
कई आधुनिक फ़्रेमवर्क (जैसे Django, Laravel, या Spring) में ORM लेयर और स्वचालित पैरामीटराइज़ेशन जैसी बिल्ट-इन सुरक्षा होती है, जो अनजाने में कमजोर क्वेरी लिखना कठिन बना देती है। लेकिन आपको इन्हें सही तरीके से इस्तेमाल करना ही होगा!
बिल्कुल। यदि कोई मोबाइल ऐप ऐसे बैकएंड API से संचार करता है जो यूज़र इनपुट के आधार पर असुरक्षित SQL क्वेरी बनाता है, तो वह उतना ही असुरक्षित है—चाहे फ्रंटएंड कितना भी लॉक-डाउन क्यों न लगे।
वे अक्सर ऑटोमेटेड स्कैनर या “Google dorking” (विशेष सर्च क्वेरी) का उपयोग करते हैं ताकि ऐसे पेज ढूँढ सकें जिनमें इनपुट फ़ील्ड्स या URL पैरामीटर हों जिन्हें एक्सप्लॉइट किया जा सके।
DataCamp के साथ सीखें
कोर्स
कोर्स
कोर्स