ক্রস-সাইট স্ক্রিপ্টিং (XSS): আক্রমণ ভেক্টর এবং প্রতিরক্ষা
কেন XSS এখনও ওয়েব অ্যাপ্লিকেশনগুলোকে আতঙ্কিত করে
ক্রস-সাইট স্ক্রিপ্টিং (XSS) সবচেয়ে প্রচলিত ওয়েব দুর্বলতাগুলোর মধ্যে একটি। ব্যাপক সচেতনতা সত্ত্বেও, এটি ধারাবাহিকভাবে OWASP Top 10-এ উপস্থিত থাকে। মূল সমস্যা: অ্যাপ্লিকেশনগুলো ব্যবহারকারীর ইনপুটকে বিশ্বাস করে এবং সঠিকভাবে পরিচালনা না করেই তা রেন্ডার করে। আক্রমণকারীরা ক্ষতিকারক স্ক্রিপ্ট ইনজেক্ট করে যা ভিক্টিমের ব্রাউজারে চলে, যার ফলে সেশন হাইজ্যাকিং, ডেটা চুরি এবং বিকৃতকরণ ঘটে।
এই নিবন্ধটি XSS আক্রমণ ভেক্টরগুলো বিশ্লেষণ করে এবং আপনি আজই প্রয়োগ করতে পারেন এমন ব্যবহারিক প্রতিরক্ষা উপস্থাপন করে।
XSS কী এবং এটি কীভাবে কাজ করে?
XSS ঘটে যখন একটি অ্যাপ্লিকেশন যাচাই বা এনকোডিং ছাড়াই একটি ওয়েব পৃষ্ঠায় অবিশ্বস্ত ডেটা অন্তর্ভুক্ত করে। তারপর ব্রাউজারটি ইনজেক্ট করা স্ক্রিপ্টটিকে বৈধ সাইটের অংশ হিসাবে চালায়। যেহেতু স্ক্রিপ্টটি দুর্বল সাইটের প্রেক্ষাপটে চলে, এটি কুকিজ, লোকাল স্টোরেজ অ্যাক্সেস করতে পারে এবং ব্যবহারকারীর পক্ষে অনুরোধ করতে পারে।
একটি সাধারণ সার্চ পৃষ্ঠা বিবেচনা করুন যা ক্যোয়ারী প্রতিফলিত করে:
<?php echo 'You searched for: ' . $_GET['q']; ?>
যদি একজন আক্রমণকারী search.php?q=<script>alert('XSS')</script> এর মতো একটি URL তৈরি করে, ভিক্টিম লিঙ্কটি পরিদর্শন করলে স্ক্রিপ্টটি কার্যকর হয়।
XSS-এর তিনটি প্রধান প্রকার
১. রিফ্লেক্টেড XSS
ক্ষতিকারক স্ক্রিপ্টটি অনুরোধের অংশ (যেমন, URL প্যারামিটার) এবং প্রতিক্রিয়াতে অবিলম্বে প্রতিফলিত হয়। ভিক্টিমদের একটি লিঙ্কে ক্লিক করতে বা একটি ফর্ম জমা দিতে প্ররোচিত করতে হয়। এটি প্রায়শই ফিশিং প্রচারণায় ব্যবহৃত হয়।
২. স্টোরড XSS
স্ক্রিপ্টটি স্থায়ীভাবে সার্ভারে সংরক্ষিত থাকে (যেমন, একটি ডেটাবেস, মন্তব্য ক্ষেত্র বা ব্যবহারকারীর প্রোফাইলে)। আক্রান্ত পৃষ্ঠার প্রতিটি দর্শনার্থী স্ক্রিপ্টটি চালায়। স্টোরড XSS আরও বিপজ্জনক কারণ পৃষ্ঠাটি দেখার বাইরে কোনও মিথস্ক্রিয়া প্রয়োজন হয় না।
৩. DOM-ভিত্তিক XSS
দুর্বলতাটি ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টে বিদ্যমান যা একটি অবিশ্বস্ত উৎস (যেমন location.hash) থেকে ডেটা পড়ে এবং নিরাপদে পরিচালনা না করেই DOM-এ লেখে। সার্ভার কখনও ক্ষতিকারক পেলোড দেখতে পায় না।
document.getElementById('output').innerHTML = location.hash.substring(1);
যদি হ্যাশে <img src=x> থাকে, স্ক্রিপ্টটি কার্যকর হয়।
সাধারণ আক্রমণ ভেক্টর
- HTML-এ অপরিবর্তিত ব্যবহারকারী ইনপুট: সরাসরি HTML বিষয়বস্তু, অ্যাট্রিবিউট বা জাভাস্ক্রিপ্টে ইনজেক্ট করা।
- বিপজ্জনক সিঙ্কের অনুপযুক্ত ব্যবহার:
innerHTML,document.write,eval, এবং স্ট্রিং আর্গুমেন্ট সহsetTimeoutএর মতো ফাংশন। - URL-ভিত্তিক ইনজেকশন:
javascript:URI দিয়েhref,src, বাstyleঅ্যাট্রিবিউট ম্যানিপুলেট করা। - তৃতীয় পক্ষের উপাদান: দুর্বল লাইব্রেরি বা উইজেট যা অবিশ্বস্ত ডেটা রেন্ডার করে।
XSS-এর বিরুদ্ধে প্রতিরক্ষা
১. আউটপুট এনকোডিং (প্রাসঙ্গিক এস্কেপিং)
HTML, অ্যাট্রিবিউট, জাভাস্ক্রিপ্ট, CSS, বা URL-এ রেন্ডার করার আগে সমস্ত অবিশ্বস্ত ডেটা এনকোড করুন। প্রসঙ্গ-উপযুক্ত এনকোডিং ব্যবহার করুন:
- HTML এন্টিটি এনকোডিং:
&,<,>,",'কে এন্টিটিতে রূপান্তর করুন। - জাভাস্ক্রিপ্ট এনকোডিং: অ-আলফানিউমেরিক অক্ষরগুলোকে ইউনিকোডে এস্কেপ করুন।
- URL এনকোডিং: ক্যোয়ারী প্যারামিটারের জন্য
encodeURIComponent()ব্যবহার করুন।
বেশিরভাগ আধুনিক ফ্রেমওয়ার্ক (React, Angular, Vue) ডিফল্টভাবে স্বয়ংক্রিয়-এস্কেপ করে, তবে dangerouslySetInnerHTML বা অনুরূপ এস্কেপ হ্যাচ ব্যবহার করার সময় সতর্ক থাকুন।
২. ইনপুট যাচাই এবং স্যানিটাইজেশন
অ্যালাউলিস্ট ব্যবহার করে সার্ভার-সাইডে ইনপুট যাচাই করুন। রিচ টেক্সটের জন্য, DOMPurify-এর মতো একটি লাইব্রেরি ব্যবহার করে HTML স্যানিটাইজ করুন, বিপজ্জনক ট্যাগ এবং অ্যাট্রিবিউট সরিয়ে ফেলুন।
const clean = DOMPurify.sanitize(userInput);
কখনও শুধুমাত্র ক্লায়েন্ট-সাইড যাচাইয়ের উপর নির্ভর করবেন না।
৩. কন্টেন্ট সিকিউরিটি পলিসি (CSP)
CSP একটি শক্তিশালী ডিফেন্স-ইন-ডেপথ ব্যবস্থা। এটি কার্যকরযোগ্য স্ক্রিপ্ট, ইনলাইন স্ক্রিপ্ট এবং অন্যান্য সম্পদের উৎস সীমাবদ্ধ করে। একটি কঠোর CSP ইনজেকশন ঘটলেও XSS ব্লক করতে পারে।
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; object-src 'none';
unsafe-inline এবং unsafe-eval এড়িয়ে চলুন। বৈধ ইনলাইন স্ক্রিপ্টের জন্য নন্স বা হ্যাশ ব্যবহার করুন।
৪. নিরাপদ কুকি অ্যাট্রিবিউট
HttpOnly (জাভাস্ক্রিপ্ট অ্যাক্সেস প্রতিরোধ করে) এবং Secure (শুধুমাত্র HTTPS) দিয়ে কুকি সেট করুন। এটি XSS-এর মাধ্যমে সেশন হাইজ্যাকিং হ্রাস করে।
৫. আধুনিক ফ্রেমওয়ার্ক ব্যবহার করুন এবং বিপজ্জনক API এড়িয়ে চলুন
React, Angular, এবং Vue-এর মতো ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে ডেটা এস্কেপ করে। innerHTML দিয়ে সরাসরি DOM ম্যানিপুলেশন এড়িয়ে চলুন। যদি HTML সন্নিবেশ করতেই হয়, প্রথমে স্যানিটাইজ করুন।
৬. নিয়মিত নিরাপত্তা পরীক্ষা
SAST, DAST, এবং ম্যানুয়াল পেনিট্রেশন টেস্টিং অন্তর্ভুক্ত করুন। OWASP ZAP-এর মতো টুল XSS দুর্বলতা সনাক্ত করতে সাহায্য করতে পারে।
XSS প্রকার এবং প্রাথমিক প্রতিরক্ষার তুলনা
| XSS প্রকার | বর্ণনা | প্রাথমিক প্রতিরক্ষা |
|---|---|---|
| রিফ্লেক্টেড | অনুরোধে পেলোড, প্রতিক্রিয়াতে প্রতিফলিত | আউটপুট এনকোডিং, ইনপুট যাচাই |
| স্টোরড | সার্ভারে সংরক্ষিত পেলোড, সমস্ত ব্যবহারকারীকে পরিবেশন করা হয় | স্যানিটাইজেশন, আউটপুট এনকোডিং, CSP |
| DOM-ভিত্তিক | অনিরাপদ DOM API-এর মাধ্যমে ক্লায়েন্ট-সাইড ইনজেকশন | নিরাপদ DOM API, CSP, eval এড়িয়ে চলুন |
ধাপে ধাপে: XSS প্রতিরক্ষা প্রয়োগ
- সমস্ত ইনপুট পয়েন্ট চিহ্নিত করুন: ফর্ম, URL প্যারামিটার, হেডার, কুকি।
- প্রাসঙ্গিক আউটপুট এনকোডিং প্রয়োগ করুন: বিল্ট-ইন ফাংশন বা OWASP Java Encoder-এর মতো লাইব্রেরি ব্যবহার করুন।
- রিচ টেক্সট স্যানিটাইজ করুন: DOMPurify বা অনুরূপ ব্যবহার করুন।
- CSP স্থাপন করুন: শুধুমাত্র রিপোর্ট মোডে শুরু করুন, তারপর প্রয়োগ করুন।
- HttpOnly এবং Secure কুকি সেট করুন।
- ডেভেলপারদের শিক্ষিত করুন: সুরক্ষিত কোডিং অনুশীলনের উপর প্রশিক্ষণ দিন।
- নিয়মিত পরীক্ষা করুন: CI/CD-তে নিরাপত্তা পরীক্ষা সংহত করুন।
সাধারণ জিজ্ঞাসা
XSS এবং CSRF-এর মধ্যে পার্থক্য কী?
XSS ভিক্টিমের ব্রাউজারে ক্ষতিকারক স্ক্রিপ্ট চালায়, যেখানে CSRF ব্রাউজারকে একটি সাইটে অননুমোদিত অনুরোধ পাঠাতে প্রতারিত করে যেখানে ব্যবহারকারী প্রমাণিত। XSS CSRF সুরক্ষা বাইপাস করতে ব্যবহার করা যেতে পারে।
কন্টেন্ট সিকিউরিটি পলিসি কি সম্পূর্ণভাবে XSS প্রতিরোধ করতে পারে?
না, CSP একটি ডিফেন্স-ইন-ডেপথ ব্যবস্থা। এটি ঝুঁকি উল্লেখযোগ্যভাবে হ্রাস করে কিন্তু সঠিক আউটপুট এনকোডিং এবং ইনপুট যাচাই প্রতিস্থাপন করতে পারে না। একটি ভুল কনফিগার করা CSP এখনও কিছু আক্রমণ অনুমোদন করতে পারে।
XSS প্রতিরোধের জন্য ক্লায়েন্ট-সাইড যাচাই কি যথেষ্ট?
না। ক্লায়েন্ট-সাইড যাচাই সহজেই বাইপাস করা যায়। সর্বদা সার্ভার-সাইডে যাচাই এবং এনকোড করুন, এবং সমস্ত ক্লায়েন্ট ডেটাকে অবিশ্বস্ত হিসাবে বিবেচনা করুন।
উপসংহার
XSS একটি অবিরাম হুমকি, কিন্তু স্তরযুক্ত প্রতিরক্ষা কৌশল—আউটপুট এনকোডিং, ইনপুট যাচাই, CSP, এবং নিরাপদ কুকি—এর মাধ্যমে আপনি কার্যকরভাবে এটি প্রশমিত করতে পারেন। সতর্ক থাকুন, ফ্রেমওয়ার্ক আপডেট রাখুন, এবং ধারাবাহিকভাবে পরীক্ষা করুন।
অতিরিক্ত নিরাপত্তা টুলিংয়ের জন্য, আপনার সার্ভার লগে সন্দেহজনক প্যাটার্ন সনাক্ত করতে আমাদের Nginx Log Analyzer দেখুন।