SQL Injection প্রতিরোধের জন্য ম্যানুয়াল SQL কোয়েরি এবং TypeORM ব্যবহার করার মধ্যে পার্থক্য তুলে ধরতে আমি দুটি উদাহরণ দেব: একটিতে SQL Injection আক্রমণের সুযোগ রয়েছে এবং অন্যটিতে TypeORM এর সেফ SQL কোয়েরি ব্যবহার করে কিভাবে আক্রমণ থেকে নিরাপদ থাকা যায়।
১. ম্যানুয়াল SQL কোয়েরি এবং SQL Injection
উদাহরণ: ম্যানুয়াল SQL কোয়েরি
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'testdb'
});
const username = req.body.username;
const password = req.body.password;
// SQL কোয়েরি তৈরি
const sql = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
connection.query(sql, (error, results) => {
if (error) {
return res.status(500).json({ message: 'Database query failed', error });
}
res.status(200).json({ results });
});
ব্যাখ্যা:
- SQL Injection: যদি ব্যবহারকারী ইনপুটে কিছু বিশেষ ক্যারেক্টার যেমন
' OR '1'='1প্রদান করে, তাহলে কোয়েরি পরিবর্তিত হবে এবং আক্রমণকারী সফলভাবে সমস্ত ইউজারদের তথ্য দেখতে সক্ষম হতে পারে।- উদাহরণ ইনপুট:
username = 'admin' AND 1=1 --এবংpassword = ''
- উদাহরণ ইনপুট:
২. TypeORM দিয়ে সেফ SQL কোয়েরি
উদাহরণ: TypeORM এর সেফ কোয়েরি
const { getRepository } = require('typeorm');
const User = require('./User');
const getUser = async (req, res) => {
try {
const { username, password } = req.body;
// TypeORM দ্বারা সেফ কোয়েরি
const userRepository = getRepository(User);
const user = await userRepository.findOne({
where: {
username: username,
password: password
}
});
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
res.status(200).json({ user });
} catch (error) {
res.status(500).json({ message: 'Database query failed', error });
}
};
ব্যাখ্যা:
- Parameterized Queries: TypeORM স্বয়ংক্রিয়ভাবে parameterized queries ব্যবহার করে, যা SQL Injection আক্রমণের বিপরীতে সুরক্ষা নিশ্চিত করে। TypeORM এ ইনপুট প্যারামিটার সঠিকভাবে স্যানিটাইজ করা হয় এবং কোয়েরি তৈরির সময় SQL Injection থেকে বাঁচানো যায়।
- Query Builder: TypeORM এর Query Builder ব্যবহার করে ডায়নামিক কোয়েরি তৈরি করতে পারেন যা SQL Injection থেকে সুরক্ষা নিশ্চিত করে।
SQL Injection আক্রমণ:
ম্যানুয়াল কোয়েরি আক্রমণ উদাহরণ:
- ব্যবহারকারী ইনপুট:
username = 'admin' AND 1=1 --এবংpassword = '' - কোয়েরি পরিবর্তিত হয়:
SELECT * FROM users WHERE username = 'admin' AND 1=1 --' AND password = '' - এই কোয়েরি সব রেকর্ডকে ফিরিয়ে দেবে কারণ
1=1শর্ত সবসময় সত্য।
TypeORM সেফ কোয়েরি:
- TypeORM স্বয়ংক্রিয়ভাবে প্যারামিটারাইজড কোয়েরি তৈরি করে। ফলে, ইনপুট ইনজেকশন শঙ্কা কমে যায়।
- ব্যবহারকারী ইনপুট:
username = 'admin' AND 1=1 --এবংpassword = '' - কোয়েরি নিরাপদভাবে
usernameএবংpasswordএর সাথে তুলনা করবে এবং ইনজেকশন হতে পারবে না।
সংক্ষেপে:
- ম্যানুয়াল কোয়েরি: ইনপুট স্যানিটাইজেশন ছাড়া সরাসরি SQL কোয়েরি তৈরি করা SQL Injection আক্রমণের সুযোগ সৃষ্টি করে।
- TypeORM: প্যারামিটারাইজড কোয়েরি ব্যবহার করে SQL Injection থেকে সুরক্ষা নিশ্চিত করে। TypeORM এর API ব্যবহার করে কোয়েরি তৈরির মাধ্যমে আপনার অ্যাপ্লিকেশনকে SQL Injection থেকে রক্ষা করা সহজ হয়।