ExpressJS অ্যাপ্লিকেশনে সিকিউরিটি নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। বিভিন্ন ধরনের আক্রমণ যেমন CSRF (Cross-Site Request Forgery), XSS (Cross-Site Scripting), এবং SQL Injection অ্যাপ্লিকেশন এবং ডেটাবেসকে ঝুঁকির মধ্যে ফেলতে পারে। এখানে আমরা আলোচনা করব কীভাবে ExpressJS অ্যাপ্লিকেশনে এই আক্রমণগুলো প্রতিরোধ করা যায়।
১. CSRF (Cross-Site Request Forgery) প্রতিরোধ
CSRF একটি ধরনের আক্রমণ যেখানে আক্রমণকারী ব্যবহারকারীকে জোরপূর্বক অপ্রত্যাশিত HTTP রিকোয়েস্ট পাঠাতে বাধ্য করে। এই রিকোয়েস্টগুলো বৈধ ব্যবহারকারীর সেশন এবং অনুমতি নিয়ে আসে, যা অ্যাপ্লিকেশনে নিরাপত্তা ঝুঁকি তৈরি করে।
১.১. CSRF প্রতিরোধে Token ব্যবহার
CSRF আক্রমণ প্রতিরোধে CSRF Token ব্যবহার করা হয়। এটি একটি নিরাপদ টোকেন যেটি প্রতিটি ফর্ম সাবমিশন বা AJAX রিকোয়েস্টের সাথে পাঠানো হয়। ব্যবহারকারী যখন সাইটে প্রবেশ করে, তখন একটি বিশেষ টোকেন তৈরি হয় এবং সেখান থেকে সমস্ত রিকোয়েস্টে ওই টোকেনটি চেক করা হয়।
csurf প্যাকেজ ExpressJS অ্যাপ্লিকেশনে CSRF টোকেন ব্যবহারের জন্য একটি জনপ্রিয় প্যাকেজ।
১.২. csurf প্যাকেজ ইনস্টলেশন
npm install csurf
১.৩. CSRF প্রতিরোধে কোড উদাহরণ
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const app = express();
const csrfProtection = csrf({ cookie: true });
app.use(cookieParser());
// ফর্ম পেজের জন্য CSRF Token প্রদান করা
app.get('/form', csrfProtection, (req, res) => {
res.send(`
<form action="/submit" method="POST">
<input type="hidden" name="_csrf" value="${req.csrfToken()}">
<button type="submit">Submit</button>
</form>
`);
});
// POST রিকোয়েস্টের জন্য CSRF Token যাচাই করা
app.post('/submit', csrfProtection, (req, res) => {
res.send('Form submitted successfully');
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
এখানে, csrfProtection middleware দিয়ে CSRF টোকেন যাচাই করা হয় এবং এটি ব্যবহারকারীর ফর্ম সাবমিশন সুরক্ষিত রাখে।
২. XSS (Cross-Site Scripting) প্রতিরোধ
XSS আক্রমণ হচ্ছে যখন আক্রমণকারী ব্যবহারকারীর ব্রাউজারে স্ক্রিপ্ট ইনজেক্ট করে, যার মাধ্যমে ব্যবহারকারীর ব্যক্তিগত তথ্য চুরি করা বা সেশন হাইজ্যাকিং হতে পারে।
২.১. XSS প্রতিরোধে Input Sanitization
XSS আক্রমণ প্রতিরোধে input sanitization অত্যন্ত গুরুত্বপূর্ণ। ব্যবহারকারীর ইনপুট থেকে HTML বা JavaScript কোড নিষিদ্ধ করার জন্য ইনপুটগুলি স্যানিটাইজ করতে হয়।
xss-clean প্যাকেজ ব্যবহার করে আপনি ইনপুট স্যানিটাইজ করতে পারেন।
২.২. xss-clean প্যাকেজ ইনস্টলেশন
npm install xss-clean
২.৩. XSS প্রতিরোধে কোড উদাহরণ
const express = require('express');
const xssClean = require('xss-clean');
const app = express();
// Request body স্যানিটাইজ করা
app.use(express.json());
app.use(xssClean());
// একটি সিম্পল POST রাউট
app.post('/comment', (req, res) => {
const userComment = req.body.comment;
res.send(`Received comment: ${userComment}`);
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
এখানে, xss-clean middleware ব্যবহার করে আমরা সমস্ত ইনপুট থেকে স্ক্রিপ্ট কোড ফিল্টার করে ফেলি।
২.৪. HTML-এ Escaping
একটি নিরাপদ প্র্যাকটিস হল HTML রেন্ডার করার সময় escaping ব্যবহার করা। এতে, ব্যবহারকারীর ইনপুটকে HTML হিসেবে রেন্ডার করার আগে নিরাপদভাবে escaping করা হয়।
const escapeHtml = require('escape-html');
// ব্যবহৃত ইনপুটকে HTML এ escaping করা
const safeString = escapeHtml('<script>alert("XSS")</script>');
এভাবে, HTML কোডে স্ক্রিপ্ট ইনজেক্ট হওয়া প্রতিরোধ করা যায়।
৩. SQL Injection প্রতিরোধ
SQL Injection আক্রমণ হল যখন আক্রমণকারী ডাটাবেসে অবৈধ SQL কোড ইনজেক্ট করে, যা ডাটাবেসের সিকিউরিটি ভেঙে ডেটা চুরি বা ক্ষতি করতে পারে।
৩.১. SQL Injection প্রতিরোধে Prepared Statements এবং ORM ব্যবহার
SQL Injection প্রতিরোধের জন্য Prepared Statements বা ORM (Object-Relational Mapping) ব্যবহার করা উচিত। এটি ব্যবহারকারীর ইনপুটের সাথে SQL কোড আলাদা করে রাখে, ফলে SQL কোডের সঙ্গে ইনপুট যুক্ত করা যায় না।
sequelize বা mongoose মতো ORM ফ্রেমওয়ার্ক ব্যবহার করে SQL Injection এর বিরুদ্ধে সুরক্ষা নিশ্চিত করা যায়।
৩.২. Prepared Statements ব্যবহার করা
const mysql = require('mysql2');
const connection = mysql.createConnection({ host: 'localhost', user: 'root', database: 'test' });
const userId = req.body.userId;
// Prepared statement ব্যবহার করে SQL কোডে ইনপুট যোগ করা
connection.execute('SELECT * FROM users WHERE id = ?', [userId], (err, results) => {
if (err) throw err;
res.json(results);
});
এখানে, ? প্লেসহোল্ডার ব্যবহার করে ডেটাবেস কুয়েরি লেখা হয়েছে, যা SQL Injection থেকে সুরক্ষিত।
৩.৩. ORM ব্যবহার করা (Sequelize)
Sequelize ORM ব্যবহার করে SQL Injection থেকে সুরক্ষা নিশ্চিত করা যায়:
const { User } = require('./models');
User.findOne({
where: {
id: req.body.userId
}
}).then(user => {
res.json(user);
});
এখানে, Sequelize ORM ডাটাবেস কুয়েরি তৈরি এবং নিরাপদভাবে ইনপুট প্রক্রিয়া পরিচালনা করে।
৪. সাধারণ সিকিউরিটি পরামর্শ
- HTTPS ব্যবহার করুন: HTTP এর পরিবর্তে HTTPS ব্যবহার করুন যাতে ডেটা এন্ড-টু-এন্ড এনক্রিপ্টেড থাকে এবং ম্যান-ইন-দ্য-মিডল (MITM) আক্রমণ থেকে সুরক্ষা নিশ্চিত হয়।
- Content Security Policy (CSP): XSS আক্রমণ প্রতিরোধে CSP ব্যবহার করুন, যা স্ক্রিপ্ট লোডিং সীমিত করে।
- HTTP Only Cookies: সেশন কুকি গুলোকে HTTP Only অ্যাট্রিবিউট ব্যবহার করে সুরক্ষিত রাখুন যাতে স্ক্রিপ্টের মাধ্যমে কুকি অ্যাক্সেস না করা যায়।
- Rate Limiting: একাধিক অপ্রত্যাশিত রিকোয়েস্ট থেকে সুরক্ষা নিশ্চিত করতে rate limiting ব্যবহার করুন, যেমন
express-rate-limitপ্যাকেজ।
সারাংশ
ExpressJS অ্যাপ্লিকেশনকে সুরক্ষিত রাখার জন্য CSRF, XSS, এবং SQL Injection এর বিরুদ্ধে সুরক্ষা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। CSRF প্রতিরোধে CSRF টোকেন ব্যবহার, XSS প্রতিরোধে ইনপুট স্যানিটাইজেশন এবং SQL Injection প্রতিরোধে Prepared Statements এবং ORM ব্যবহার করা উচিত। এই পদ্ধতিগুলোর মাধ্যমে আপনার অ্যাপ্লিকেশনকে বিভিন্ন ধরনের সিকিউরিটি ঝুঁকি থেকে রক্ষা করা সম্ভব।
Read more