SQL Injection কী?
SQL Injection একটি ধরনের নিরাপত্তা আক্রমণ, যেখানে আক্রমণকারী ডেটাবেসে অনিচ্ছাকৃত বা ম্যালিসিয়াস SQL কোড ইনজেক্ট করে, যা ডেটাবেসের তথ্য চুরি, পরিবর্তন, বা মুছে ফেলার কারণ হতে পারে। এটি সাধারণত ডেটাবেসে সরাসরি ইউজার ইনপুটের মাধ্যমে কোড চালানো থেকে ঘটে। SQL ইনজেকশন আক্রমণ প্রতিরোধ করা খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন ইউজার থেকে ডেটা নেওয়া হয় এবং তা SQL কুয়েরিতে ব্যবহার করা হয়।
TypeORM এবং SQL Injection
TypeORM ডেটাবেস ম্যানিপুলেশন সহজ করে তোলে, তবে ডেটাবেসের নিরাপত্তা নিশ্চিত করতে কিছু সতর্কতা অবলম্বন করা জরুরি। TypeORM স্বয়ংক্রিয়ভাবে parameterized queries ব্যবহার করে, যা SQL Injection আক্রমণ থেকে সুরক্ষা নিশ্চিত করে। Parameterized queries-এ ব্যবহারকারীর ইনপুট আলাদা করে SQL কুয়েরি থেকে, যা SQL Injection আক্রমণের জন্য ঝুঁকি কমিয়ে দেয়।
TypeORM-এ Parameterized Queries ব্যবহার
Parameterized Queries হল এমন কুয়েরি, যেখানে ইউজার ইনপুট সরাসরি SQL কুয়েরির অংশ হিসেবে ব্যবহার না করে, একটি আলাদা প্যারামিটার হিসেবে ব্যবহৃত হয়। এর মাধ্যমে, SQL ইঞ্জেকশন আক্রমণ প্রতিরোধ করা যায়।
উদাহরণ ১: find এবং where মেথডের মাধ্যমে parameterized query
ধরা যাক, আপনি একটি User টেবিল থেকে ইউজারদের নাম অনুসারে ডেটা খুঁজতে চান। এখানে SQL Injection প্রতিরোধ করতে parameterized query ব্যবহার করা হচ্ছে।
import { createConnection, getRepository } from 'typeorm';
import { User } from './entity/User';
createConnection().then(async () => {
const userRepository = getRepository(User);
// Parameterized Query: SQL Injection থেকে সুরক্ষিত
const user = await userRepository.findOne({ where: { name: 'John Doe' } });
console.log(user);
}).catch(error => console.log(error));
এখানে, findOne মেথডের মধ্যে where প্যারামিটার ব্যবহার করা হয়েছে, যেখানে name এবং তার মান আলাদা করে প্রদান করা হয়েছে, যা SQL Injection আক্রমণ প্রতিরোধ করতে সাহায্য করে।
উদাহরণ ২: QueryBuilder ব্যবহার করে parameterized query
TypeORM-এ QueryBuilder ব্যবহার করে কাস্টম SQL কুয়েরি তৈরি করা যেতে পারে, এবং এতে parameterized query ব্যবহার করা যায়।
import { createConnection } from 'typeorm';
import { User } from './entity/User';
createConnection().then(async connection => {
const userRepository = connection.getRepository(User);
// Parameterized Query using QueryBuilder
const user = await userRepository
.createQueryBuilder('user')
.where('user.name = :name', { name: 'John Doe' })
.getOne();
console.log(user);
}).catch(error => console.log(error));
এখানে, :name একটি প্যারামিটার হিসেবে ব্যবহৃত হয়েছে এবং এটি name: 'John Doe' এর মানের সাথে সংযুক্ত। এই পদ্ধতিতে, ইউজার ইনপুট সরাসরি SQL কুয়েরির অংশ হিসেবে যুক্ত করা হয় না, ফলে SQL Injection আক্রমণ প্রতিরোধ করা সম্ভব হয়।
TypeORM-এর SQL Injection থেকে সুরক্ষা:
- Parameterization: TypeORM-এর
findমেথড,QueryBuilder, এবং অন্যান্য ডেটাবেস ফাংশনগুলির মধ্যে প্যারামিটারাইজড কুয়েরি ব্যবহার করে ইউজার ইনপুট SQL কুয়েরি থেকে আলাদা রাখা হয়, যা SQL Injection আক্রমণ থেকে সুরক্ষা নিশ্চিত করে। QueryBuilderব্যবহার: TypeORM-এQueryBuilderএর মাধ্যমে কাস্টম কুয়েরি তৈরি করা হলে, প্যারামিটারগুলি আলাদা করে ব্যবহৃত হয়, যা SQL Injection আক্রমণ থেকে সুরক্ষা দেয়।createQueryBuilder-এর মাধ্যমে আপনি কাস্টম SQL কুয়েরি তৈরি করতে পারবেন, এবং এতে প্যারামিটার দিয়ে ইনপুট মান সরবরাহ করতে পারবেন।- Input Validation: TypeORM শুধুমাত্র SQL ইনজেকশন প্রতিরোধ করতে সাহায্য করে না, তবে ইউজারের ইনপুট যাচাই করার জন্য আপনি সঠিক ইনপুট ভ্যালিডেশনও করতে পারেন (যেমন, নাম, ইমেইল ইত্যাদি ফিল্ডগুলির জন্য নিয়মিত অভ্যস্ত মান চেক করা)।
- No Dynamic Queries: ডাইনামিক SQL কুয়েরি তৈরি করার ক্ষেত্রে সতর্কতা অবলম্বন করা উচিত। ডাইনামিক SQL কুয়েরি সাধারণত SQL Injection আক্রমণের জন্য ঝুঁকি সৃষ্টি করতে পারে, তাই প্যারামিটারাইজড কুয়েরি ব্যবহার করাই ভাল।
SQL Injection এর বিরুদ্ধে সুরক্ষিত অন্যান্য কৌশল:
- Prepared Statements: TypeORM-এ কাস্টম SQL কুয়েরি তৈরি করার সময় Prepared Statements ব্যবহার করতে পারেন, যা SQL কোড এবং ইউজার ইনপুটকে আলাদা করে রাখে।
- ORM ব্যবহার: TypeORM বা অন্য কোন ORM ব্যবহার করার মাধ্যমে ডেটাবেসের সাথে নিরাপদ যোগাযোগ নিশ্চিত করা যায়, কারণ ORM স্বয়ংক্রিয়ভাবে SQL Injection থেকে সুরক্ষা প্রদান করে।
- Escaping User Input: যখনই ইউজার ইনপুট নেওয়া হয়, তার মধ্যে বিশেষ ক্যারেক্টার যেমন
';--ইত্যাদি থাকলে সেগুলিকে escape করে সুরক্ষা প্রদান করা উচিত।
সারাংশ
SQL Injection আক্রমণ প্রতিরোধ করতে TypeORM ব্যবহারকারীকে স্বয়ংক্রিয়ভাবে parameterized queries প্রদান করে। find, QueryBuilder, এবং অন্যান্য TypeORM মেথডগুলো নিরাপদভাবে SQL কুয়েরি তৈরি করার জন্য প্যারামিটারাইজড ইনপুট ব্যবহার করে, যা SQL Injection আক্রমণ প্রতিরোধে সহায়ক। TypeORM-এর মাধ্যমে সঠিকভাবে প্যারামিটারাইজড কুয়েরি ব্যবহার করে, আপনি আপনার অ্যাপ্লিকেশনকে SQL Injection আক্রমণ থেকে সুরক্ষিত রাখতে পারেন।
Read more