SQL Injection

SQL इंजेक्शन के बारे में जानें और जानें कि अपने डेटाबेस को कैसे सुरक्षित रखें

SQL Injection क्या हैं?

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

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

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

⚠️चेतावनी:

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

वेब पेजों में SQL

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

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

असुरक्षित कोड:

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

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

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

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

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

उपयोगकर्ता इनपुट:

UserId: 105 OR 1=1

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

परिणामी SQL है:

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

उपरोक्त SQL मान्य है और "उपयोगकर्ता" तालिका से सभी पंक्तियाँ लौटाएगा क्योंकि OR 1=1 हमेशा सत्य है।

🔓सुरक्षा का उल्लंघन करना:

क्या उपरोक्त उदाहरण खतरनाक लगता है? यदि "उपयोगकर्ता" तालिका में नाम और पासवर्ड हों तो क्या होगा? एक हैकर इनपुट फ़ील्ड में केवल 105 या 1=1 डालकर डेटाबेस में सभी उपयोगकर्ता नाम और पासवर्ड तक पहुंच प्राप्त कर सकता है।

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

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

सामान्य लॉगिन:

Username: John Doe
Password: myPass

सर्वर कोड:

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"

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

हैकर इनपुट:

User Name: " or ""="
Password: " or ""="

सर्वर पर कोड एक वैध SQL कथन उत्पन्न करेगा:

निष्कर्ष:

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

उपरोक्त SQL मान्य है और "उपयोगकर्ता" तालिका से सभी पंक्तियाँ लौटाएगा क्योंकि OR ""='' हमेशा सत्य है।

संकलित SQL कथनों पर आधारित SQL इंजेक्शन

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

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

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

खतरनाक एसक्यूएल:

SELECT * FROM Users; DROP TABLE Suppliers

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

सर्वर कोड:

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

फिर निम्नलिखित दर्ज करें:

हैकर इनपुट:

User id: 105; DROP TABLE Suppliers

एक वैध SQL कथन इस तरह दिखेगा:

निष्कर्ष:

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

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

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

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

ASP.NET Razor उदाहरण

संरक्षित कोड:

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

💡नोट:

SQL कथन में पैरामीटर्स को @ प्रतीक द्वारा दर्शाया जाता है। SQL इंजन यह सुनिश्चित करता है कि प्रत्येक पैरामीटर उसके कॉलम के लिए मान्य है और इसे सीधे निष्पादित किया जाने वाला SQL के भाग के रूप में नहीं माना जाता है।

एक और उदाहरण

INSERT उदाहरण:

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();

एसक्यूएल इंजेक्शन रोकथाम सर्वोत्तम अभ्यास

पैरामीटर प्रश्न हैं

  • पैरामीटर क्वेरीज़ का उपयोग कब करें
  • सीधे SQL स्ट्रिंग से बचें
  • स्वचालित रूप से डेटा पूर्वाग्रह से बचा जाता है
  • सभी प्रमुख डेटाबेस पर काम करता है

अभिगम नियंत्रण

  • कम से कम पहुंच नीति का प्रयोग करें
  • केवल पढ़ने योग्य खातों का उपयोग करें
  • संग्रहित प्रक्रियाओं का प्रयोग करें
  • अनुमतियों की नियमित रूप से समीक्षा करें

इनपुट सत्यापन

  • सभी उपयोगकर्ता इनपुट सत्यापित करें
  • श्वेतसूची के आधार पर जांच करें
  • अनावश्यक अक्षर हटाएँ
  • डेटा प्रकारों की पुष्टि करें

अभ्यास

SQL injection क्या हैं?

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