टी एल; डॉ
- आवेदन इनपुट को स्वीकार करता है, इस मामले में 'नैन्सी', बिना प्रयास किए - इनपुट को संपीड़ित करता है, जैसे कि अन्य पात्रों को बचाना
विद्यालय => INSERT INTO students VALUES ( 'नैन्सी' ); INSERT 0 1
- SQL इंजेक्शन तब होता है जब एक डेटाबेस कमांड में इनपुट को हेरफेर किया जाता है - डेटाबेस सर्वर को मनमाने ढंग से SQL
स्कूल को निष्पादित करने का कारण बनता है => INSERT INTO छात्रों को VALUES ( 'रॉबर्ट' );
ड्रॉप टेबल छात्रों ; - '); INSERT 0 1 ड्रॉप टेबल
- छात्र के रिकॉर्ड अब चले गए हैं - यह और भी बुरा हो सकता था!
स्कूल => छात्रों से चयन करें * ;
त्रुटि : संबंध "छात्रों" है नहीं मौजूद
LINE 1 : छात्रों से चयन करें * ; ^
यह छात्र तालिका को हटाता है (हटाता है)।
( इस उत्तर में सभी कोड उदाहरण PostgreSQL 9.1.2 डेटाबेस सर्वर पर चलाए गए थे। )
यह स्पष्ट करने के लिए कि क्या हो रहा है, आइए इसे केवल एक साधारण तालिका के साथ आज़माएँ जिसमें केवल नाम फ़ील्ड है और एक पंक्ति जोड़ें:
स्कूल => बनाएं टेबल छात्रों ( नाम पाठ प्राथमिक कुंजी );
नोटिस : बनाएँ टेबल / प्राथमिक कुंजी होगा बनाने के अंतर्निहित सूचकांक "students_pkey" के लिए तालिका "छात्रों" बनाएँ टेबल
स्कूल =>
सम्मिलित करें जांच छात्रों मान ( 'जॉन' ); INSERT 0 1
मान लें कि तालिका में डेटा डालने के लिए एप्लिकेशन निम्न SQL का उपयोग करता है:
INSERT इनटू स्टूडेंट्स वैल्यूज़ ( 'फोब्बर' );
foobar
छात्र के वास्तविक नाम के साथ बदलें । एक सामान्य सम्मिलित ऑपरेशन इस तरह दिखेगा:
- इनपुट: नैन्सी
स्कूल => INSERT INTO छात्र VALUES ( 'नैन्सी' ); INSERT 0 1
जब हम तालिका की क्वेरी करते हैं, तो हमें यह मिलता है:
स्कूल => छात्रों से चयन करें * ;
नाम
-------
जॉन
नैन्सी
( 2 पंक्तियाँ )
जब हम टेबल में लिटिल बॉबी टेबल्स का नाम डालते हैं तो क्या होता है?
- इनपुट: रॉबर्ट '); ड्रॉप टेबल छात्रों; -
स्कूल => INSERT इनटू स्टूडेंट्स वैल्यूज़ ( 'रॉबर्ट' ); ड्रॉप टेबल छात्रों ; - '); INSERT 0 1 ड्रॉप टेबल
यहां SQL इंजेक्शन स्टेटमेंट को समाप्त करने और एक अलग DROP TABLE
कमांड सहित छात्र के नाम का परिणाम है ; इनपुट के अंत में दो डैश किसी भी बचे हुए कोड पर टिप्पणी करने के लिए अभिप्रेत हैं जो अन्यथा एक त्रुटि का कारण होगा। आउटपुट की अंतिम पंक्ति यह पुष्टि करती है कि डेटाबेस सर्वर ने तालिका को गिरा दिया है।
यह ध्यान रखना महत्वपूर्ण है कि INSERT
ऑपरेशन के दौरान एप्लिकेशन किसी विशेष वर्ण के लिए इनपुट की जांच नहीं कर रहा है, और इसलिए SQL कमांड में मनमाने इनपुट को दर्ज करने की अनुमति दे रहा है। इसका मतलब यह है कि एक दुर्भावनापूर्ण उपयोगकर्ता, उपयोगकर्ता इनपुट के लिए सामान्य रूप से इच्छित फ़ील्ड में सम्मिलित कर सकता है, विशेष प्रतीकों जैसे उद्धरण के साथ-साथ मनमाने ढंग से SQL कोड डेटाबेस सिस्टम को निष्पादित करने का कारण बनता है, इसलिए SQL इंजेक्शन ।
परिणाम?
स्कूल => छात्रों से चयन करें * ;
त्रुटि : संबंध "छात्रों" है नहीं मौजूद
लाइन 1 : का चयन करें * से छात्रों ; ^
SQL इंजेक्शन एक ऑपरेटिंग सिस्टम या एप्लिकेशन में दूरस्थ मनमानी कोड निष्पादन भेद्यता के बराबर डेटाबेस है । एक सफल SQL इंजेक्शन हमले के संभावित प्रभाव को कम करके नहीं आंका जा सकता है - डेटाबेस सिस्टम और एप्लिकेशन कॉन्फ़िगरेशन के आधार पर, इसका उपयोग हमलावर द्वारा डेटा हानि (इस मामले में) के रूप में किया जा सकता है, डेटा तक अनधिकृत पहुंच प्राप्त कर सकता है, या निष्पादित भी कर सकता है। मेजबान मशीन पर खुद को मनमाना कोड।
जैसा कि XKCD कॉमिक द्वारा उल्लेख किया गया है, SQL इंजेक्शन के हमलों से बचाव का एक तरीका डेटाबेस इनपुट को साफ करना है, जैसे कि विशेष वर्णों से बचकर, ताकि वे अंतर्निहित SQL कमांड को संशोधित न कर सकें और इसलिए मनमाने ढंग से SQL कोड के निष्पादन का कारण न बन सकें। यदि आप पैरामीटर किए गए प्रश्नों का उपयोग करते हैं, जैसे कि SqlParameter
ADO.NET में उपयोग करके , तो इनपुट, न्यूनतम, स्वचालित रूप से SQL इंजेक्शन के साथ सुरक्षा के लिए संचित किया जाएगा।
हालाँकि, अनुप्रयोग स्तर पर इनपुट को सैनिटाइज़ करना अधिक उन्नत SQL इंजेक्शन तकनीकों को रोक नहीं सकता है। उदाहरण के लिए, PHP फ़ंक्शन को दरकिनार करने के तरीके हैंmysql_real_escape_string
। अतिरिक्त सुरक्षा के लिए, कई डेटाबेस सिस्टम तैयार कथनों का समर्थन करते हैं । यदि बैकएंड में ठीक से लागू किया गया है, तो तैयार किए गए बयान एसक्यूएल इंजेक्शन को असंभव बना सकते हैं क्योंकि डेटा इनपुट को शब्दशः बाकी कमांड से अलग माना जाता है।