एसक्यूएल इंजेक्शन
एसक्यूएल इंजेक्षन
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();