SQL Injection
SQL Injection একটি মারাত্মক নিরাপত্তা দুর্বলতা যেখানে আক্রমণকারী (attacker) ইচ্ছাকৃতভাবে ইনপুট পরিবর্তন করে ডাটাবেস কুয়েরিতে হস্তক্ষেপ করতে পারে। এর ফলে অ্যাপ্লিকেশন তার স্বাভাবিক নিয়মে কুয়েরি চালায় না এবং আক্রমণকারী সেনসিটিভ ডাটা দেখতে, পরিবর্তন বা মুছে ফেলতেও সক্ষম হয়।
SQL Injection কিভাবে কাজ করে?
১. কুয়েরি ম্যানিপুলেশন করে অতিরিক্ত ডাটা বের করা
সাধারণ কুয়েরি:
URL: https://insecure-website.com/products?category=Gifts
Query: SELECT * FROM products WHERE category = 'Gifts' AND enabled = 1
আক্রমণকারী ইনপুট:
URL: https://insecure-website.com/products?category=Gifts'--
Query: SELECT * FROM products WHERE category = 'Gifts'--' AND enabled = 1
👉 এখানে --
কমেন্ট হিসেবে কাজ করে, ফলে AND enabled = 1
অংশটি কার্যকর হয় না।
২. লগইন লজিক বাইপাস করা
সাধারণ কুয়েরি:
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
আক্রমণকারী ইনপুট:
username: administrator'--
Query: SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
👉 এর ফলে পাসওয়ার্ড যাচাই আর হয় না — আক্রমণকারী সরাসরি অ্যাডমিন একাউন্টে ঢুকতে পারে।
৩. অন্য টেবিলের ডাটা নিয়ে আসা
সাধারণ কুয়েরি:
Query: SELECT name, description FROM products WHERE category = 'Gifts'
আক্রমণকারী ইনপুট:
category: ' UNION SELECT username, password FROM users--
Query: SELECT name, description FROM products WHERE category = '' UNION SELECT username, password FROM users--'
👉 ফলে users
টেবিলের ইউজারনেম ও পাসওয়ার্ডসহ গুরুত্বপূর্ণ তথ্য ফাঁস হয়ে যায়।
SQL Injection কিভাবে চিনবেন?
- ইনপুটে
'
(সিঙ্গেল কোট) দিলে যদি এরর আসে
- SQL সিনট্যাক্স যুক্ত ইনপুট দিলে অস্বাভাবিক আচরণ করে
- ইনপুটে
OR 1=1
টাইপ স্টেটমেন্ট দিলে সব রেকর্ড দেখায়
SQL Injection প্রতিরোধ কৌশল
- ইনপুট ভ্যালিডেশন: ইউজার ইনপুট যাচাই করুন
- স্পেশাল ক্যারেক্টার Escaping: ইনপুটে স্পেশাল ক্যারেক্টার নিষিদ্ধ করুন
- Prepared Statements ব্যবহার করুন: SQL কুয়েরির জন্য প্যারামিটারাইজড কুয়েরি ব্যবহার করুন
কোড উদাহরণ
Java (Prepared Statement):
String custname = request.getParameter("customerName");
// Input validation করুন
String query = "SELECT account_balance FROM user_data WHERE user_name = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery();
Hibernate (Safe Query):
// Unsafe HQL (এটা ব্যবহার করবেন না!)
Query unsafeHQLQuery = session.createQuery("from Inventory where productID='" + userSuppliedParameter + "'");
// Safe HQL
Query safeHQLQuery = session.createQuery("from Inventory where productID = :productid");
safeHQLQuery.setParameter("productid", userSuppliedParameter);
উপসংহার
SQL Injection হলো এমন একটি আক্রমণ যেটি আপনার অ্যাপ্লিকেশনের ডাটাবেস সম্পূর্ণভাবে উন্মুক্ত করে দিতে পারে। একটু সচেতনতা ও নিরাপদ প্রোগ্রামিং চর্চা করলেই এটি সহজেই প্রতিরোধ করা সম্ভব।
নিরাপদ কোডিং করুন, নিরাপদ থাকুন!