इंजेक्शन हमलों की श्रेणी में, PHP SQL इंजेक्शन हमला बहुत प्रमुखता से सामने आया है। अधिकांश वेबसाइटें इसकी चपेट में हैं। शोध के अनुसार, SQL इंजेक्शन का उपयोग करके वेब पर 50% से अधिक हमले किए गए। इस लेख में, हम चर्चा करेंगे कि SQL इंजेक्शन कैसे किया जाता है और हम इसे PHP अनुप्रयोगों में कैसे रोक सकते हैं।
एसक्यूएल इंजेक्शन (एसक्यूएलआई) क्या है?
सबसे पहले, हम SQL इंजेक्शन को समझते हैं। एसक्यूएल इंजेक्शन (एसक्यूएलआई) एक दृष्टिकोण है जहां हैकर्स निष्पादित 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 कथनों को बार-बार निष्पादित किया जा सकता है। पीडीओ ऐसे तरीके प्रदान करता है जो पैरामीटरयुक्त प्रश्नों को उपयोग में आसान बनाते हैं। यह कोड की पठनीयता और पोर्टेबिलिटी को भी बढ़ाता है और न केवल MySQL डेटाबेस बल्कि अन्य प्रकार के डेटाबेस के साथ भी काम करता है। पीडीओ परिभाषित करता है कि किस भाग को उपयोगकर्ता इनपुट के रूप में माना जाए और शेष भाग को डेटाबेस कमांड के रूप में माना जाए।
MySQL डेटाबेस के लिए PDO के लिए एक उदाहरण कोड स्निपेट है:
//DB credentials
define(‘DB_HOST','localhost');
define(‘DB_USER','John_Reaper');
define(‘DB_PASS','[email protected]@$$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(‘Connection to database unsuccessful');
}
}
else
{
http_response_code(400);
die(‘Error processing malformed request');
}
}
PHP SQL इंजेक्शन को कैसे रोकें
इस प्रकार, आप निम्न सर्वोत्तम प्रथाओं को लागू करके अपनी वेबसाइटों को SQL इंजेक्शन से सुरक्षित कर सकते हैं:
- जावास्क्रिप्ट का उपयोग करके या तो फ्रंट एंड पर या PHP का उपयोग करके बैकएंड पर उपयोगकर्ता इनपुट को मान्य करना।
- उपयोगकर्ता को त्रुटि प्रदर्शित नहीं करना। इसके बजाय, त्रुटियों को एक फ़ाइल में लॉग करना और इसे एक हमलावर के लिए दुर्गम बनाना। साथ ही, उपयोगकर्ता को प्रदर्शित होने वाला त्रुटि संदेश बहुत सामान्य होना चाहिए और डेटाबेस के बारे में कोई जानकारी प्रकट नहीं करना चाहिए।
- पैरामीटरयुक्त क्वेरी का उपयोग करना जो SQL क्वेरी के उस भाग को निर्दिष्ट करती है जिसे उपयोगकर्ता इनपुट के रूप में माना जाना चाहिए।
- अप्रयुक्त संग्रहित प्रक्रियाओं को हटाना क्योंकि वे आसानी से शोषक हैं और इस प्रकार SQL इंजेक्शन को रोकते हैं।
- यदि हमलावर प्रमाणीकरण को दरकिनार कर देते हैं, तो किसी भी समझौते से बचने के लिए उचित उपयोगकर्ताओं को उचित अधिकार देना।
PHP SQL इंजेक्शन से अंतिम सुरक्षा
एस्ट्रा जैसे फ़ायरवॉल का उपयोग करने से आपकी प्रतिरक्षा SQLi तक बढ़ सकती है। SQLi के अलावा, Astra Security Suite एक वेबसाइट को 100 से अधिक हमलों से बचाता है, जिनमें से कुछ खराब बॉट, XSS, CSRF आदि हैं।
हमारा मैलवेयर स्कैनर किसी वेबसाइट को 10 मिनट से भी कम समय में स्कैन करने के लिए जाना जाता है। और बाद के स्कैन के लिए और भी कम समय (<1 मिनट) लगता है। हमारी सुरक्षा ऑडिट और पेंटेस्टिंग पेशकश के तहत, एस्ट्रा के इंजीनियर सुरक्षा को अभेद्य बनाने के लिए आपकी वेबसाइट में कमजोरियों को खोजने और सुधारने के लिए कोड की प्रत्येक पंक्ति को मैन्युअल रूप से स्कैन करते हैं।
आज ही एस्ट्रा डेमो लें!