इंजेक्शन अटैक्स की श्रेणी में, PHP SQL इंजेक्शन अटैक बेहद प्रमुख रूप से उभरा है। अधिकांश वेबसाइटें इसके प्रति संवेदनशील हैं। शोध के अनुसार, वेब पर 50% से अधिक हमले SQL इंजेक्शन का उपयोग करके किए गए थे। इस लेख में, हम चर्चा करेंगे कि SQL इंजेक्शन कैसे किया जाता है और PHP एप्लिकेशन में इसे कैसे रोका जा सकता है।
SQL इंजेक्शन (SQLi) क्या है?
पहले, आइए SQL इंजेक्शन को समझते हैं। SQL इंजेक्शन (SQLi) एक ऐसी तकनीक है जहां हैकर निष्पादित SQL कमांड्स को जालसाजी करके बैकएंड पर चल रहे SQL स्टेटमेंट को बदल देते हैं। इस प्रकार का इंजेक्शन फॉर्म के इनपुट फील्ड्स के माध्यम से किया जाता है और डेटाबेस पर भयानक प्रभाव डालता है। यह अंततः डेटाबेस से अत्यधिक संवेदनशील जानकारी के प्रकटीकरण की ओर ले जाता है। चूंकि हैकर SQL कमांड्स इंजेक्ट करके डेटाबेस पर नियंत्रण प्राप्त कर लेता है, इसलिए उसे डेटाबेस में डेटा डालने, अपडेट करने या यहां तक कि डिलीट करने का अधिकार मिल जाता है।
SQL इंजेक्शन अटैक तब होता है जब कोड सुरक्षित तरीके से नहीं लिखा जाता है। उनमें से कुछ सुरक्षित कोडिंग में लिखे हुए प्रतीत होते हैं, लेकिन फिर भी SQLi की गुंजाइश छोड़ देते हैं:
- स्पेस कैरेक्टर्स और टाइप हैंडलिंग का गलत फिल्ट्रेशन
- डेटाबेस को अनसैनिटाइज्ड, अनुचित रूप से एन्कोडेड डेटा पास करना
- कोड और डेटा का मिश्रण
- स्ट्रिंग्स को डिलिमिट करने के लिए कोटेशन मार्क्स का उपयोग
संक्षेप में, जब यूजर इनपुट को ठीक से वैलिडेट नहीं किया जाता है, तो यह डेटाबेस द्वारा यूजर डेटा को दुर्भावनापूर्वक इंटरप्रेट किए जाने की ओर ले जाता है। यदि यूजर इनपुट को सीधे फ्रंट-एंड से लेकर क्वेरी में डाल दिया जाता है, तो यह भी समझौता का कारण बनेगा।
एक और मुद्दा जो SQLi की ओर ले जाता है, वह यह है कि एरर्स यूजर को प्रदर्शित की जाती हैं जिनका दुरुपयोग एक दुर्भावनापूर्ण यूजर डेटाबेस के प्रकार और संस्करण के बारे में विवरण प्राप्त करने के लिए कर सकता है और इस प्रकार SQL इंजेक्शन अटैक का कारण बनने वाले एक्सप्लॉइट्स को तैनात कर सकता है।
PHP SQL इंजेक्शन क्या है?
असुरक्षित कोड का उदाहरण
आइए निम्नलिखित कमजोर PHP कोड की मदद से PHP SQL इंजेक्शन अटैक की अवधारणा को समझते हैं:
<?php
$username = $_POST['uname'];
$pass = $_POST['password'];
$sql = "SELECT * FROM user_table WHERE username='".$username."' AND userpwd='".$pass"';";
?>
उपरोक्त कोड बिना किसी वैलिडेशन के सीधे यूजर इनपुट को स्वीकार करता है और इसे सीधे उस SQL क्वेरी में डाल देता है जो डेटाबेस पर चलेगी। एक हैकर इसमें लॉजिकल क्वेरीज भी डाल सकता है जो एक ट्रू रिजल्ट लौटाएंगी यानी यदि $password वेरिएबल को मान " या '1'='1' के रूप में मिलता है तो मान 1=1 हो जाता है जो हमेशा ट्रू होता है। यह अंततः एक सफल लॉगिन की ओर ले जाएगा जो एक गंभीर सुरक्षा समझौते का कारण बनेगा।
इसके अलावा, एक और परिदृश्य पर विचार करें जहां एरर यूजर पर प्रदर्शित होती है:
<?php
...
...
elseif($mysqli->error)
{
print($mysqli->error);
}
?>
इस परिदृश्य में, एरर लॉग्स को यूजर स्क्रीन पर प्रिंट करने के बजाय, एक डेटाबेस रखना बेहतर अभ्यास होगा जहां एरर लॉग्स दर्ज किए जा सकें और बाद में यह जांचने के लिए उपयोग किया जा सके कि वेबसाइट कितनी बार SQLi के अधीन थी।
सुरक्षित कोड का उदाहरण
PHP SQL इंजेक्शन से बचने के लिए सुरक्षित कोडिंग का एक उदाहरण यूजरनेम और पासवर्ड को ऐसी लॉजिकल क्वेरीज के लिए निम्नलिखित तरीके से वैलिडेट करना हो सकता है:
<?php
Function checkUserInput($str)
{
return
str_replace(array("'","\"", "'", '"'),array("'",""","'",""",$str));
}
$username = checkUserInput($_POST['uname']);
$pass = checkUserInput($_POST['password']);
?>
इस तरीके से, यूजर इनपुट को SQL क्वेरी में जोड़ने से पहले वैलिडेट किया जा सकता है। PHP SQL इंजेक्शन को रोकने का एक अन्य दृष्टिकोण प्रिपेयर्ड स्टेटमेंट्स (PHP डेटा ऑब्जेक्ट्स - PDO) का उपयोग करना है। यह एक कुशल दृष्टिकोण है जिसमें SQL स्टेटमेंट्स को बार-बार निष्पादित किया जा सकता है। PDO पैरामीटराइज्ड क्वेरीज को आसान बनाने के तरीके प्रदान करता है। यह कोड की पठनीयता और पोर्टेबिलिटी को भी बढ़ाता है और न केवल MySQL डेटाबेस बल्कि अन्य प्रकार के डेटाबेस के साथ भी काम करता है। PDO परिभाषित करता है कि किस भाग को यूजर इनपुट के रूप में माना जाए और शेष भाग को डेटाबेस कमांड के रूप में।
MySQL डेटाबेस के लिए PDO का एक उदाहरण कोड स्निपेट:
//DB क्रेडेंशियल्स
define('DB_HOST','localhost');
define('DB_USER','John_Reaper');
define('DB_PASS','admin@wsxdn.com@$$w0rd$');
define('DB_NAME','users');
if(isset($_GET['id']))
{
$id = $_GET['id'];
if(is_numeric($id) == true)
{
try
{
$dbh = new PDO('DBHOST;DB_NAME','DB_USER','DB_PASS');
$dbh->setAttribute(PDO::AFTER_ERRMODE, PDO::ERRMODE_EXCEPTION);
$q = "SELECT username FROM users WHERE id = :id";
$sth = $dbh->prepare($q);
$sth->bindParam(':id',$id);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);
$res = $sth->fetchColumn();
print(htmlentities($res));
$dbh = null;
}
catch(PDOException $e)
{
error_log('PDOException - '.$e->getMessage(),0);
http_response_code(500);
die('डेटाबेस से कनेक्शन असफल');
}
}
else
{
http_response_code(400);
die('गलत अनुरोध प्रसंस्करण त्रुटि');
}
}
PHP SQL इंजेक्शन को कैसे रोकें
इस प्रकार, आप निम्नलिखित सर्वोत्तम प्रथाओं को लागू करके अपनी वेबसाइटों को SQL इंजेक्शन से सुरक्षित कर सकते हैं:
- यूजर इनपुट को या तो फ्रंट एंड पर JavaScript का उपयोग करके या बैकएंड पर PHP का उपयोग करके वैलिडेट करना।
- एरर को यूजर को प्रदर्शित न करना। इसके बजाय, एरर्स को एक फाइल में लॉग करना और इसे हमलावर के लिए दुर्गम बनाना। साथ ही, यूजर को प्रदर्शित होने वाला एरर मैसेज बहुत सामान्य होना चाहिए और डेटाबेस के बारे में कोई जानकारी प्रकट नहीं करनी चाहिए।
- पैरामीटराइज्ड क्वेरी का उपयोग करना जो SQL क्वेरी के उस हिस्से को निर्दिष्ट करती है जिसे यूजर इनपुट के रूप में माना जाना चाहिए।
- अनउपयोग्ड स्टोर्ड प्रोसीजर्स को हटाना क्योंकि वे आसानी से शोषण योग्य होते हैं और इस प्रकार SQL इंजेक्शन को रोकते हैं।
- उचित यूजर्स को उचित अधिकार देना ताकि अगर हमलावर ऑथेंटिकेशन को बायपास कर भी दे तो कोई समझौता न हो।
PHP SQL इंजेक्शन से परम सुरक्षा
एस्ट्रा जैसे फायरवॉल का उपयोग SQLi के प्रति आपकी प्रतिरक्षा को बढ़ा सकता है। SQLi के अलावा, एस्ट्रा सिक्योरिटी सूट एक वेबसाइट को 100+ से अधिक हमलों से बचाता है, जिनमें से कुछ हैं बैड बॉट्स, XSS, CSRF आदि।
हमारा मैलवेयर स्कैनर एक वेबसाइट को 10 मिनट से कम समय में स्कैन करने के लिए जाना जाता है। और बाद के स्कैन के लिए और भी कम समय (<1 मिनट) लगता है। हमारे सिक्योरिटी ऑडिट और पेनटेस्टिंग पेशकश के तहत, एस्ट्रा के इंजीनियर आपकी वेबसाइट में कमजोरियों को खोजने और ठीक करने के लिए कोड की प्रत्येक लाइन को मैन्युअली स्कैन करते हैं ताकि सुरक्षा अभेद्य बने।
आज ही एस्ट्रा डेमो लें!