অসুরক্ষিত Node.js Express অ্যাপ্লিকেশনের উদাহরণ
// app.js
const express = require('express');
const app = express();
const port = 3000;
app.use(express.urlencoded({ extended: true }));
// হোম পেজে একটি ফর্ম প্রদর্শন
app.get('/', (req, res) => {
res.send(`
<h1>স্বাগতম!</h1>
<form method="POST" action="/greet">
<label>আপনার নাম লিখুন:</label>
<input type="text" name="name" />
<button type="submit">জমা দিন</button>
</form>
`);
});
// ফর্ম সাবমিশন হ্যান্ডেল করা
app.post('/greet', (req, res) => {
const name = req.body.name;
res.send(`<h2>হ্যালো, ${name}!</h2>`);
});
app.listen(port, () => {
console.log(`অ্যাপটি চলছে http://localhost:${port}`);
});
এই অ্যাপ্লিকেশনে সমস্যা কোথায়:
- ব্যবহারকারীর ইনপুট
nameকোনো স্যানিটাইজেশন ছাড়াই সরাসরি HTML-এ রেন্ডার হচ্ছে। - আক্রমণকারী ইনপুট ফিল্ডে ম্যালিশিয়াস কোড ইনজেক্ট করতে পারে।
XSS আক্রমণের উদাহরণ:
- আক্রমণকারী
nameফিল্ডে নিচের মতো কোড ইনপুট করতে পারে:
<script>alert('আপনি হ্যাকড হয়েছেন!');</script>
- এর ফলে, যখন পেজটি রেন্ডার হবে, এই স্ক্রিপ্টটি ব্যবহারকারীর ব্রাউজারে চলবে এবং একটি পপ-আপ মেসেজ প্রদর্শন করবে।
- আরও খারাপ, আক্রমণকারী জটিল স্ক্রিপ্ট ব্যবহার করে ব্যবহারকারীর কুকি বা অন্যান্য তথ্য চুরি করতে পারে।
ডেমো:
- অ্যাপটি চালু করুন:
node app.js - ব্রাউজারে
http://localhost:3000ভিজিট করুন। - নামের জায়গায়
<script>alert('আপনি হ্যাকড হয়েছেন!');</script>ইনপুট দিন এবং সাবমিট করুন। - দেখবেন যে একটি পপ-আপ মেসেজ প্রদর্শিত হচ্ছে, যা প্রমাণ করে যে স্ক্রিপ্টটি চলেছে।
কিভাবে XSS আক্রমণ প্রতিরোধ করা যায়
সমাধান: ব্যবহারকারীর ইনপুট স্যানিটাইজ করা এবং বিশেষ ক্যারেক্টারগুলো এস্কেপ করা যাতে তারা HTML বা জাভাস্ক্রিপ্ট হিসেবে ব্যাখ্যা না হয়।
নিরাপদ কোডের উদাহরণ:
// app.js
const express = require('express');
const app = express();
const port = 3000;
const escape = require('escape-html'); // ইনপুট এস্কেপ করার জন্য প্যাকেজ
app.use(express.urlencoded({ extended: true }));
// হোম পেজে একটি ফর্ম প্রদর্শন
app.get('/', (req, res) => {
res.send(`
<h1>স্বাগতম!</h1>
<form method="POST" action="/greet">
<label>আপনার নাম লিখুন:</label>
<input type="text" name="name" />
<button type="submit">জমা দিন</button>
</form>
`);
});
// ফর্ম সাবমিশন হ্যান্ডেল করা
app.post('/greet', (req, res) => {
const name = req.body.name;
const safeName = escape(name); // ইনপুট এস্কেপ করা
res.send(`<h2>হ্যালো, ${safeName}!</h2>`);
});
app.listen(port, () => {
console.log(`অ্যাপটি চলছে http://localhost:${port}`);
});
নিরাপদ কোডে কি করা হয়েছে:
escape-htmlপ্যাকেজ ব্যবহার: এই প্যাকেজটি ইনপুটে থাকা বিশেষ ক্যারেক্টারগুলোকে এস্কেপ করে, যাতে তারা HTML ট্যাগ হিসেবে ব্যাখ্যা না হয়।- ইনপুট স্যানিটাইজেশন:
escape(name)ব্যবহার করে ইনপুটকে সুরক্ষিত করা হয়েছে।
কিভাবে কাজ করে:
- যখন ব্যবহারকারী ইনপুটে ম্যালিশিয়াস কোড দেয়, যেমন
<script>alert('আপনি হ্যাকড হয়েছেন!');</script>, তখনescapeফাংশন এটি এস্কেপ করে এমনভাবে যে এটি সাধারণ টেক্সট হিসেবে রেন্ডার হয়। - ফলে, স্ক্রিপ্টটি আর এক্সিকিউট হয় না এবং XSS আক্রমণ প্রতিরোধ হয়।
ডেমো:
- অ্যাপটি চালু করুন:
node app.js - ব্রাউজারে
http://localhost:3000ভিজিট করুন। - নামের জায়গায়
<script>alert('আপনি হ্যাকড হয়েছেন!');</script>ইনপুট দিন এবং সাবমিট করুন। - এবার দেখবেন যে স্ক্রিপ্টটি সাধারণ টেক্সট হিসেবে প্রদর্শিত হচ্ছে, কোনো পপ-আপ মেসেজ আসছে না।
XSS আক্রমণ প্রতিরোধের কিছু সাধারণ পদ্ধতি:
- ইনপুট ভ্যালিডেশন ও স্যানিটাইজেশন: ব্যবহারকারীর ইনপুট সর্বদা যাচাই এবং স্যানিটাইজ করুন।
- আউটপুট এস্কেপিং: আউটপুটে ইনপুট ডেটা ব্যবহারের আগে তা এস্কেপ করুন।
- কন্টেন্ট সিকিউরিটি পলিসি (CSP) ব্যবহার: এটি নির্ধারণ করে কোন উৎস থেকে স্ক্রিপ্ট চলতে পারবে।
- HTTP-Only কুকি ব্যবহার: যাতে জাভাস্ক্রিপ্টের মাধ্যমে কুকি অ্যাক্সেস করা না যায়।