एसक्यूएल ट्यूटोरियल

एसक्यूएल होम एसक्यूएल परिचय एसक्यूएल सिंटेक्स एसक्यूएल चुनें एसक्यूएल अलग का चयन करें एसक्यूएल कहां एसक्यूएल और, या, नहीं SQL आदेश द्वारा एसक्यूएल सम्मिलित करें एसक्यूएल शून्य मान एसक्यूएल अपडेट एसक्यूएल हटाएं एसक्यूएल शीर्ष का चयन करें एसक्यूएल न्यूनतम और अधिकतम एसक्यूएल गणना, औसत, योग एसक्यूएल लाइक एसक्यूएल वाइल्डकार्ड एसक्यूएल इन एसक्यूएल के बीच एसक्यूएल उपनाम एसक्यूएल जुड़ता है एसक्यूएल इनर जॉइन एसक्यूएल लेफ्ट जॉइन एसक्यूएल राइट जॉइन एसक्यूएल पूर्ण शामिल हों एसक्यूएल सेल्फ जॉइन एसक्यूएल संघ एसक्यूएल ग्रुप बाय एसक्यूएल होने एसक्यूएल मौजूद है एसक्यूएल कोई, सभी एसक्यूएल में चयन करें चयन में एसक्यूएल डालें एसक्यूएल केस एसक्यूएल अशक्त कार्य SQL संग्रहीत कार्यविधियाँ एसक्यूएल टिप्पणियाँ एसक्यूएल ऑपरेटर्स

SQL डेटाबेस

एसक्यूएल डीबी बनाएँ एसक्यूएल ड्रॉप डीबी एसक्यूएल बैकअप डीबी एसक्यूएल तालिका बनाएं एसक्यूएल ड्रॉप टेबल SQL परिवर्तन तालिका एसक्यूएल बाधाएं एसक्यूएल शून्य नहीं है एसक्यूएल अद्वितीय एसक्यूएल प्राथमिक कुंजी एसक्यूएल विदेशी कुंजी एसक्यूएल चेक एसक्यूएल डिफ़ॉल्ट एसक्यूएल सूचकांक एसक्यूएल ऑटो इंक्रीमेंट एसक्यूएल तिथियां एसक्यूएल दृश्य एसक्यूएल इंजेक्षन एसक्यूएल होस्टिंग SQL डेटा प्रकार

एसक्यूएल संदर्भ

एसक्यूएल कीवर्ड मायएसक्यूएल फंक्शन्स SQL सर्वर कार्य एमएस एक्सेस फ़ंक्शंस एसक्यूएल त्वरित रेफरी

एसक्यूएल उदाहरण

एसक्यूएल उदाहरण एसक्यूएल प्रश्नोत्तरी एसक्यूएल व्यायाम SQL प्रमाणपत्र

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


एसक्यूएल इंजेक्षन

SQL इंजेक्शन एक कोड इंजेक्शन तकनीक है जो आपके डेटाबेस को नष्ट कर सकती है।

SQL इंजेक्शन सबसे आम वेब हैकिंग तकनीकों में से एक है।

SQL इंजेक्शन वेब पेज इनपुट के माध्यम से SQL कथनों में दुर्भावनापूर्ण कोड की नियुक्ति है।


वेब पेजों में एसक्यूएल

SQL इंजेक्शन आमतौर पर तब होता है जब आप किसी उपयोगकर्ता से इनपुट मांगते हैं, जैसे उनका उपयोगकर्ता नाम/उपयोगकर्ता आईडी, और नाम/आईडी के बजाय, उपयोगकर्ता आपको एक SQL कथन देता है जिसे आप अनजाने में अपने डेटाबेस पर चलाएंगे।

निम्नलिखित उदाहरण को देखें जो SELECTएक चुनिंदा स्ट्रिंग में एक वेरिएबल (txtUserId) जोड़कर एक स्टेटमेंट बनाता है। चर उपयोगकर्ता इनपुट (getRequestString) से प्राप्त किया जाता है:

उदाहरण

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

इस अध्याय का शेष भाग SQL कथनों में उपयोगकर्ता इनपुट के उपयोग के संभावित खतरों का वर्णन करता है।


1=1 पर आधारित SQL इंजेक्शन हमेशा सही होता है

ऊपर के उदाहरण को फिर से देखें। कोड का मूल उद्देश्य किसी दिए गए उपयोगकर्ता आईडी के साथ उपयोगकर्ता का चयन करने के लिए SQL कथन बनाना था।

यदि उपयोगकर्ता को "गलत" इनपुट दर्ज करने से रोकने के लिए कुछ भी नहीं है, तो उपयोगकर्ता इस तरह कुछ "स्मार्ट" इनपुट दर्ज कर सकता है:

प्रयोक्ता आईडी:

फिर, SQL कथन इस तरह दिखेगा:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

उपरोक्त SQL मान्य है और "उपयोगकर्ता" तालिका से सभी पंक्तियों को वापस कर देगा, क्योंकि OR 1=1 हमेशा TRUE होता है।

क्या ऊपर दिया गया उदाहरण खतरनाक दिखता है? क्या होगा यदि "उपयोगकर्ता" तालिका में नाम और पासवर्ड हों?

ऊपर दिया गया SQL कथन बहुत कुछ ऐसा ही है:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

एक हैकर एक डेटाबेस में सभी उपयोगकर्ता नाम और पासवर्ड तक पहुंच प्राप्त कर सकता है, बस इनपुट क्षेत्र में 105 या 1=1 डालने से।



""="" पर आधारित SQL इंजेक्शन हमेशा सही होता है

वेब साइट पर उपयोगकर्ता लॉगिन का एक उदाहरण यहां दिया गया है:

उपयोगकर्ता नाम:

कुंजिका:

उदाहरण

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

परिणाम

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

एक हैकर केवल उपयोगकर्ता नाम या पासवर्ड टेक्स्ट बॉक्स में "या" "=" डालने से डेटाबेस में उपयोगकर्ता नाम और पासवर्ड तक पहुंच प्राप्त कर सकता है:

उपयोगकर्ता नाम:

कुंजिका:

सर्वर पर कोड इस तरह एक वैध SQL कथन बनाएगा:

परिणाम

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

उपरोक्त SQL मान्य है और "उपयोगकर्ता" तालिका से सभी पंक्तियों को वापस कर देगा, क्योंकि OR ""="" हमेशा TRUE होता है।


बैच किए गए SQL कथनों के आधार पर SQL इंजेक्शन 

अधिकांश डेटाबेस बैच किए गए SQL कथन का समर्थन करते हैं।

SQL कथनों का एक बैच दो या दो से अधिक SQL कथनों का एक समूह है, जो अर्धविराम द्वारा अलग किया जाता है।

नीचे दिया गया SQL कथन "उपयोगकर्ता" तालिका से सभी पंक्तियों को वापस कर देगा, फिर "आपूर्तिकर्ता" तालिका को हटा देगा।

उदाहरण

SELECT * FROM Users; DROP TABLE Suppliers

निम्नलिखित उदाहरण देखें:

उदाहरण

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

और निम्नलिखित इनपुट:

प्रयोक्ता आईडी:

मान्य SQL कथन इस तरह दिखेगा:

परिणाम

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

सुरक्षा के लिए SQL पैरामीटर्स का उपयोग करें

किसी वेब साइट को SQL इंजेक्शन से बचाने के लिए, आप SQL पैरामीटर का उपयोग कर सकते हैं।

SQL पैरामीटर वे मान हैं जो एक नियंत्रित तरीके से निष्पादन समय पर SQL क्वेरी में जोड़े जाते हैं।

ASP.NET रेजर उदाहरण

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);

ध्यान दें कि पैरामीटर SQL कथन में @ मार्कर द्वारा दर्शाए जाते हैं।

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

एक और उदाहरण

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);

उदाहरण

निम्नलिखित उदाहरण दिखाता है कि कुछ सामान्य वेब भाषाओं में पैरामीटरयुक्त प्रश्नों का निर्माण कैसे किया जाता है।

ASP.NET में चयन कथन:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();

ASP.NET में कथन में सम्मिलित करें:

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();

PHP में कथन में सम्मिलित करें:

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();