ইনজেকশন আক্রমণের শ্রেণিতে, PHP SQL ইনজেকশন আক্রমণ খুবই বিখ্যাত। অধিকাংশ ওয়েবসাইট এতে আক্রান্ত হয়। গবেষণা অনুযায়ী, ওয়েবে ৫০% এরও বেশি আক্রমণ SQL ইনজেকশনের মাধ্যমে হয়। এই লেখায় আমরা আলোচনা করব কিভাবে SQL ইনজেকশন করা হয় এবং PHP অ্যাপ্লিকেশনে তা কীভাবে প্রতিরোধ করা যায়।
SQL ইনজেকশন (SQLi) কী?
প্রথমে SQL ইনজেকশন বুঝতে পারি। SQL ইনজেকশন (SQLi) হল একটি পদ্ধতি যেখানে হ্যাকাররা বэкен্ডে চলমান SQL স্টেটমেন্টকে নকল SQL কমান্ড চালিয়ে পরিবর্তন করে। এই ধরনের ইনজেকশন ফর্মের ইনপুট ফিল্ডের মাধ্যমে করা হয় এবং ডেটাবেসে ভয়াবহ প্রভাব ফেলে। এর ফলে ডেটাবেস থেকে অত্যন্ত সংবেদনশীল তথ্য lộখা যায়। হ্যাকার 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 কোয়েরিতে ঢুকায় যা ডেটাবেসে চলে। একটি হ্যাকার সেখানে লজিক্যাল কোয়েরি যোগ করতে পারে যা ফলাফল true রিটার্ন করবে—যেমন $password ভেরিয়েবলে ” বা ‘1’=’1’ মান আসলে 1=1 হয় যা সবসময় true। এর ফলে সফল লগইন হয় এবং গভীর সুরক্ষা ভাঙoned হয়।
একইভাবে, যখন এরর ইউজারকে দেখানো হয়:
<?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 Data Objects - PDO) ব্যবহার। এটি একটি দক্ষ পদ্ধতি যেখানে SQL স্টেটমেন্ট বারবার এক্সিকিউট করা যায়। PDO প্যারামিটারাইজড কোয়েরি সহজ করে তোলে। এটি কোডের পঠনযোগ্যতা এবং পোর্টেবিলিটি বাড়ায় এবং শুধু MySQL নয়, অন্যান্য ডেটাবেসের ওপরও কাজ করে। PDO নির্ধারণ করে কোন অংশ ইউজার ইনপুট হিসেবে বিবেচনা হবে এবং বাকি অংশ ডেটাবেস কমান্ড।
MySQL ডেটাবেসের জন্য PDO কোড স্নিপেট:
//DB credentials
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('Connection to database unsuccessful');
}
}
else
{
http_response_code(400);
die('Error processing malformed request');
}
}
PHP SQL ইনজেকশন প্রতিরোধ কীভাবে করবেন
তাই, আপনার ওয়েবসাইটকে SQL ইনজেকশন থেকে সুরক্ষিত রাখতে নিচের সেরা অভ্যাসগুলো বাস্তবায়ন করুন:
- ফ্রন্টএন্ডে JavaScript বা ব্যাকএন্ডে PHP-তে ইউজার ইনপুট ভ্যালিডেট করুন।
- ইউজারকে এরর দেখাবেন না। এরর লগ ফাইলে সংরক্ষণ করুন এবং আক্রমণকারীর কাছে অ্যাক্সেসIBLE না রাখুন। ইউজারকে দেখানো এরর মেসেজ জেনেরিক হতে হবে, ডেটাবেস সম্পর্কে কোনো তথ্য না দিন।
- প্যারামিটারাইজড কোয়েরি ব্যবহার করুন যা SQL কোয়েরির কোন অংশ ইউজার ইনপুট হিসেবে বিবেচিত হবে তা নির্দিষ্ট করে।
- অনব্যবহৃত স্ট্রোড প্রোসিজার সরান কারণ সেগুলো সহজে এক্সপ্লয়েটযোগ্য এবং SQL ইনজেকশন প্রতিরোধ করে।
- উপযুক্ত ব্যবহারকারীদের উপযুক্ত অধিকার দিন যাতে অথেন্টিকেশন বাইপাস করলেও কোম্প্রোমাইজ না হয়।
PHP SQL ইনজেকশন থেকে চূড়ান্ত সুরক্ষা
অস্ত্রা (Astra) এর মতো ফায়ারওয়াল ব্যবহার করলে SQLi-এর বিরুদ্ধে আপনার প্রতিরোধক্ষমতা বাড়বে। SQLi ছাড়াও অস্ত্রা সিকিউরিটি স্যুট ১০০+ আরও আক্রমণ থেকে ওয়েবসাইটকে রক্ষা করে, যथा—ব্যাড বটস, XSS, CSRF ইত্যাদি।
আমাদের ম্যালওয়ার স্ক্যানার ১০ মিনিটের কম সময়ে একটি ওয়েবসাইট স্ক্যান করে। পরবর্তী স্ক্যানের জন্য আরও কম সময় (<১ মিনিট) লাগে। আমাদের সিকিউরিটি অডিট এবং পেনটেস্টিং অফারিং-এ অস্ত্রার エンজিনিয়াররা প্রতিটি কোড লাইন ম্যানুয়ালি স্ক্যান করে আপনার ওয়েবসাইটের ভালনারেবিলিটি খুঁজে বের করে এবং সেগুলো মেনে দেয় সুরক্ষা অভেদ্য করতে।
আজই অস্ত্রা ডেমো নিন!