Cross-Origin WebSocket সংযোগের নিরাপত্তা একটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে যখন আপনার ওয়েব অ্যাপ্লিকেশন বা সার্ভার একাধিক ডোমেইনের মধ্যে যোগাযোগ করছে। সাধারণত, Cross-Origin Resource Sharing (CORS) সংক্রান্ত নিরাপত্তা নিয়মাবলী HTTP রিকোয়েস্টের জন্য প্রযোজ্য, কিন্তু Web Sockets এ এর ব্যবহার কিছুটা আলাদা।
Cross-Origin WebSocket সংযোগের ঝুঁকি
Cross-Origin WebSocket সংযোগের মাধ্যমে যখন এক ডোমেইন থেকে অন্য ডোমেইনে ডেটা আদান-প্রদান করা হয়, তখন কিছু নিরাপত্তাজনিত ঝুঁকি তৈরি হতে পারে, যেমন:
- Data Interception (ডেটা ইন্টারসেপশন): একটি তৃতীয় পক্ষ যদি কানেকশনের মাঝখানে অবস্থান করে, তবে তারা ডেটা সংগ্রহ করতে পারে যদি যোগাযোগ এনক্রিপ্টেড না হয়।
- Cross-Site WebSocket Hijacking (CSWSH): এ ধরনের আক্রমণে, আক্রমণকারী অন্যের WebSocket কানেকশন হাইজ্যাক করতে পারে এবং তাতে অবৈধভাবে ডেটা পাঠাতে পারে।
- Denial of Service (DoS): Cross-Origin WebSocket কানেকশনের মাধ্যমে একটি সার্ভারে অতিরিক্ত লোড ফেলা হতে পারে, যা সার্ভারের কার্যক্ষমতা কমিয়ে দিতে পারে।
WebSocket ব্যবহার করার সময় এই ধরনের ঝুঁকি থেকে নিরাপদ থাকার জন্য কিছু কৌশল অবলম্বন করা যেতে পারে।
১. WebSocket সংযোগের নিরাপত্তা নিশ্চিত করা
WebSocket সংযোগের নিরাপত্তা নিশ্চিত করার জন্য প্রথমেই গুরুত্বপূর্ণ হল HTTPS (Secure WebSocket - wss://) ব্যবহার করা, যা সংযোগটি এনক্রিপ্ট করবে এবং নিরাপত্তা বাড়াবে। ws:// (অ্যাডহক WebSocket) এর পরিবর্তে, wss:// ব্যবহার করা উচিত, কারণ এটি TLS/SSL এনক্রিপশন প্রোটোকল ব্যবহার করে, যা তথ্য ট্রান্সমিশনের সময় হ্যাকিং বা ম্যান-ইন-দ্য-মিডল (MITM) আক্রমণ প্রতিরোধ করে।
১.১ TLS/SSL এনক্রিপশন (wss://)
const WebSocket = require('ws');
const fs = require('fs');
const https = require('https');
// HTTPS সার্ভার তৈরি
const server = https.createServer({
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('certificate.pem')
});
// WebSocket সার্ভার সেটআপ
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(ws) {
console.log('Secure WebSocket connection established');
ws.send('Welcome to the secure WebSocket server!');
});
// সার্ভার চালু করা
server.listen(8080, () => {
console.log('Server is listening on https://localhost:8080');
});
এখানে wss:// প্রোটোকল ব্যবহার করা হয়েছে, যা WebSocket কানেকশনের মধ্যে এনক্রিপশন প্রবর্তন করবে এবং আক্রমণের ঝুঁকি কমাবে।
২. Origin চেক করা
WebSocket কানেকশনের সময় ব্রাউজার একটি Origin হেডার পাঠায়, যা সার্ভারকে জানায় যে, কোন ডোমেইন থেকে কানেকশন আসছে। সার্ভারকে অবশ্যই এই Origin হেডারটি চেক করতে হবে, এবং শুধুমাত্র অনুমোদিত ডোমেইন থেকেই কানেকশন গ্রহণ করতে হবে।
২.১ Origin চেকের মাধ্যমে Cross-Origin WebSocket কানেকশন নিয়ন্ত্রণ
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
handleProtocols: (protocols, request) => {
const origin = request.headers.origin;
// Origin চেক করা
if (origin === 'https://trusted-domain.com') {
return true; // Origin অনুমোদিত হলে কানেকশন গ্রহণ
} else {
return false; // Origin না মেললে কানেকশন অস্বীকার
}
}
});
wss.on('connection', function connection(ws) {
console.log('Connected to trusted domain');
});
এখানে, সার্ভার request.headers.origin হেডারটি চেক করে এবং শুধুমাত্র নির্দিষ্ট ডোমেইন থেকে আসা কানেকশনগুলিকে অনুমতি দেয়। এভাবে, আপনি Cross-Origin WebSocket সংযোগে নিরাপত্তা নিশ্চিত করতে পারেন।
৩. WebSocket সংযোগে Authentication ও Authorization
WebSocket কানেকশনের মাধ্যমে অনুপ্রবেশকারী বা অবৈধ ব্যবহারকারী দ্বারা আক্রমণ রোধ করার জন্য Authentication এবং Authorization অত্যন্ত গুরুত্বপূর্ণ। যদি কানেকশনটি সংবেদনশীল ডেটার সাথে সম্পর্কিত হয়, তবে সার্ভারের কাছে Token-based Authentication বা Session-based Authentication ব্যবহার করা উচিত।
৩.১ Authentication এর মাধ্যমে নিরাপত্তা
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, request) {
const token = request.headers['authorization']; // Token পাঠানো হতে পারে HTTP হেডারে
if (!token || !isValidToken(token)) {
ws.close(4000, 'Unauthorized'); // অননুমোদিত টোকেন থাকলে কানেকশন বন্ধ করুন
} else {
console.log('Authorized connection');
}
});
function isValidToken(token) {
// টোকেন যাচাই করার ফাংশন
return token === 'valid-token';
}
এখানে, authorization হেডারের মাধ্যমে সার্ভার ক্লায়েন্টের টোকেন যাচাই করছে। যদি টোকেন বৈধ না হয়, তাহলে কানেকশন বন্ধ হয়ে যাবে।
৪. WebSocket এবং CORS (Cross-Origin Resource Sharing)
যদিও CORS মূলত HTTP রিকোয়েস্টের জন্য ব্যবহৃত হয়, তবে কিছু WebSocket সার্ভারে CORS নীতি প্রয়োগ করা যেতে পারে। এর মাধ্যমে সার্ভারটি কোন Origin থেকে আসা WebSocket কানেকশন অনুমোদিত তা নির্ধারণ করতে পারে।
৪.১ WebSocket CORS কনফিগারেশন
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws, request) {
const origin = request.headers.origin;
if (origin === 'https://trusted-origin.com') {
console.log('Connection from trusted origin');
} else {
ws.close(4000, 'Invalid origin');
}
});
এখানে, যদি Origin হেডারটি একটি নির্দিষ্ট ডোমেইন (যেমন https://trusted-origin.com) থেকে আসে, তাহলে WebSocket কানেকশনটি অনুমোদিত হবে, অন্যথায় এটি বন্ধ করা হবে।
৫. Rate Limiting এবং DoS প্রতিরোধ
Cross-Origin WebSocket সংযোগের মাধ্যমে একাধিক কানেকশন আসতে পারে, যা সিস্টেমের ওপর অতিরিক্ত চাপ ফেলতে পারে। এর ফলে Denial of Service (DoS) আক্রমণ হতে পারে, যেখানে সার্ভার অনুপস্থিত হয়ে যায়। তাই, Rate Limiting বা সীমাবদ্ধতা প্রয়োগ করা জরুরি। এর মাধ্যমে সার্ভার ক্লায়েন্টকে একটিভ কানেকশন গড় সীমার মধ্যে রাখতে বাধ্য করতে পারে।
সারাংশ
Cross-Origin WebSocket সংযোগের নিরাপত্তা নিশ্চিত করার জন্য একাধিক পদক্ষেপ নেয়া প্রয়োজন। প্রথমত, TLS/SSL এনক্রিপশন ব্যবহার করে WebSocket কানেকশনের নিরাপত্তা বাড়াতে হবে (যেমন wss://)। দ্বিতীয়ত, Origin চেকিং ব্যবহার করে শুধুমাত্র অনুমোদিত ডোমেইন থেকে কানেকশন গ্রহণ করতে হবে। তৃতীয়ত, Authentication ও Authorization প্রক্রিয়া কার্যকর করা উচিত যাতে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা সংযোগ স্থাপন করতে পারে। অবশেষে, Rate Limiting এবং DoS আক্রমণ প্রতিরোধ কৌশল প্রয়োগ করলে WebSocket সংযোগ আরও নিরাপদ ও কার্যকরী হবে।
Read more