Cross-site scripting (XSS): ধরন, প্রভাব ও প্রতিরোধ
XSS আক্রমণকারীকে আপনার user-দের browser-এ নিজের JavaScript চালাতে দেয়। তিন ধরন এবং স্তরে স্তরে প্রতিরক্ষা জানুন।

Cross-site scripting (XSS) হয় যখন সাইট অবিশ্বস্ত input যথাযথ সামলানো ছাড়াই পেজে বসায়, ফলে আক্রমণকারীর JavaScript ভুক্তভোগীর browser-এ সাইটের আস্থা নিয়ে চলে।
আক্রমণকারী কী করতে পারে
ভুক্তভোগীর session-এ চলতে পারে, মানে: পেজে দেখানো data পড়া, user-এর হয়ে কাজ করা, JavaScript দিয়ে পড়া যায় এমন token চুরি, ভুয়া login ফর্ম দেখানো বা ক্ষতিকর সাইটে redirect।
তিন ধরন
Reflected XSS। Request-এর input (যেমন URL-এ search term) পেজে প্রতিধ্বনিত হয়। আক্রমণকারী ভুক্তভোগীকে বানানো লিংক খুলতে ভোলায়।
Stored XSS। ক্ষতিকর input সংরক্ষিত হয় (comment, profile, পণ্যের review) এবং যে প্রত্যেক visitor দেখে তাকে দেখানো হয়। সাধারণত সবচেয়ে বিপজ্জনক।
DOM-based XSS। Bug client-side JavaScript-এ, যা অবিশ্বস্ত data পেজে লেখে, যেমন URL থেকে পাওয়া মান নিয়ে innerHTML ব্যবহার।
একটি নিরীহ প্রদর্শন
Comment box আপনার টাইপ করা encode ছাড়া দেখালে <script>alert(1)</script> লিখলে alert বক্স আসে। এতে বোঝা যায় script চলে। আসল আক্রমণকারী alert-এর বদলে ক্ষতিকর কিছু করবে। শুধু নিজের test অ্যাপে চেষ্টা করুন।
প্রতিরোধ
১. Context অনুযায়ী output encode করুন। data কোথায় বসছে তার ওপর নির্ভর করে বিশেষ অক্ষরকে নিরাপদ রূপে বদলান: HTML টেক্সট, HTML attribute, JavaScript, CSS বা URL। আধুনিক framework (React, Vue, Angular, Astro template) ডিফল্টে escape করে। আজকের বেশিরভাগ XSS এটি এড়ানো থেকে আসে।
২. বিপজ্জনক API এড়ান। innerHTML, document.write, dangerouslySetInnerHTML, v-html, eval। textContent ও নিরাপদ template binding ব্যবহার করুন।
৩. HTML অনুমতি দিতে হলে sanitize করুন। User rich text জমা দিতে পারলে বিশ্বস্ত কোড পথে DOMPurify-র মতো allow-list sanitizer দিয়ে (রক্ষণাবেক্ষিত সংস্করণ) চালান। নিজে regex filter লিখবেন না।
৪. Content Security Policy (CSP)। Response header যা script কোথা থেকে লোড হতে পারে সীমিত করে এবং inline script আটকায়। একটি bug ফসকে গেলেও কড়া CSP শক্ত দ্বিতীয় প্রতিরক্ষা।
৫. Cookie flag। HttpOnly JavaScript-কে session cookie পড়তে দেয় না। Secure ও SameSite আরও সুরক্ষা দেয়।
৬. Input যাচাই করুন যেখানে যুক্তিসঙ্গত, কিন্তু তার ওপর নির্ভর করবেন না। Output encoding-ই মূল।
সাধারণ ভুল
- ভুল context-এর জন্য encode (JavaScript block-এর ভেতরে বসা data-কে HTML-encode করা)।
- নিজের database থেকে এসেছে বলে data বিশ্বাস করা (আক্রমণকারী সংরক্ষণ করে থাকতে পারে)।
href-এ user-নিয়ন্ত্রিত URL অনুমতি দেওয়া, যেখানেjavascript:লিংক কোড চালাতে পারে। শুধুhttpওhttpsঅনুমতি দিন।- নিজস্ব bug বা compromise-সহ তৃতীয় পক্ষের script।
মূল কথা: context অনুযায়ী output encode করুন, raw HTML API এড়ান, যে HTML অনুমতি দেন তা sanitize করুন, এবং backup হিসেবে Content Security Policy ও HttpOnly cookie যোগ করুন।
ওয়েব সিকিউরিটি সিরিজ, পর্ব ১ (injection ও access control): 2 নম্বর (মোট 4)। আগের লেখা: SQL injection: কীভাবে কাজ করে ও কীভাবে ঠেকাবেন.

