'বিশ্বস্ত প্রকার' হল একটি নিরাপত্তা ফিচার যা DOM-ভিত্তিক ক্রস-সাইট স্ক্রিপ্টিং (DOM XSS) প্রতিরোধ করতে সাহায্য করে। এর জন্য "বিপজ্জনক" ব্রাউজার API-তে (সিঙ্ক নামে পরিচিত) পাস করা ডেটা প্রথমে একটি নির্দিষ্ট প্রকারে রূপান্তরিত করতে হয়, যেমন TrustedHTML।
ডিফল্ট হিসেবে, অনেক DOM API (যেমন innerHTML বা document.write) র-স্ট্রিং গ্রহণ করে। কোনও স্ট্রিংয়ে যদি কোনও বিশ্বস্ত নয় এমন সোর্স থেকে ক্ষতিকর স্ক্রিপ্ট থাকে, তাহলে সেটি এক্সিকিউট করা যেতে পারে। Trusted Types এই আচরণ পরিবর্তন করে: CSP-এর মাধ্যমে একবার চালু করা হলে, এইসব সিঙ্ক শুধুমাত্র অনুমোদিত নীতি দ্বারা তৈরি করা TrustedHTML অবজেক্ট গ্রহণ করবে।
প্রয়োগ সংক্রান্ত গুরুত্বপূর্ণ বিবরণ
Trusted Types ব্যবহার করতে, চারটি প্রধান ধাপ অনুসরণ করুন:
- একটি নিরাপত্তা নীতি নির্ধারণ করুন যা স্ট্রিং কীভাবে স্যানিটাইজ বা ট্রান্সফর্ম করতে হবে তা নির্দিষ্ট করে।
- র স্ট্রিং থেকে বিশ্বস্ত ধরনের অবজেক্ট তৈরি করতে সেই নীতি ব্যবহার করুন।
- DOM সিঙ্কে লেখার সময় বিশ্বস্ত টাইপ অবজেক্ট ব্যবহার করুন।
- কন্টেন্ট সুরক্ষা সংক্রান্ত নীতি (CSP) ব্যবহার করে বিশ্বস্ত প্রকার প্রয়োগ করুন।
১. নীতি তৈরি করা হচ্ছে
নীতি হল কন্টেন্ট স্যানিটাইজ করার জন্য এক সেট নিয়ম। আপনি trustedTypes.createPolicy() ব্যবহার করে এটি তৈরি করেন, সাধারণত DOMPurify-এর মতো স্যানিটাইজার লাইব্রেরি বা আপনার অ্যাপ্লিকেশনের HTML এস্কেপিং নিয়মে ডেলিগেট করেন:
import DOMPurify from 'dompurify';
const myPolicy = trustedTypes.createPolicy('sanitize-html', {
createHTML: (input) =>
// Return a sanitized string; createPolicy() wraps it in a TrustedHTML object.
// Example using DOMPurify:
DOMPurify.sanitize(input, { RETURN_TRUSTED_TYPE: false }),
});
// Example using HTML escaping (for environments without third-party sanitizers):
const escapePolicy = trustedTypes.createPolicy('escape-html', {
createHTML: (input) =>
String(input)
.replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"')
.replaceAll("'", '''),
});
২. নীতি ব্যবহার করা
সিঙ্কে সরাসরি স্ট্রিং পাস করার পরিবর্তে, আপনি নীতির তৈরি করার পদ্ধতিকে কল করেন।
const untrustedInput = '<p>Hello, <strong>world</strong>!</p><img src="x" onerror="alert(1)">';
// In an enforced environment, this would throw a TypeError:
// element.innerHTML = untrustedInput;
// This returns a TrustedHTML object with unsafe elements and attributes removed:
const cleanHTML = myPolicy.createHTML(untrustedInput);
// Result: "<p>Hello, <strong>world</strong>!</p><img src=\"x\">"
৩. বিশ্বস্ত প্রকার ব্যবহার করার জন্য সিঙ্ক ট্রানজিশন করা হচ্ছে
আপনি সিঙ্কে লেখেন এমন প্রতিটি ইনস্ট্যান্স আপডেট করুন যাতে প্রথমে এটি একটি বিশ্বস্ত ধরনের অবজেক্টে রূপান্তরিত হয়। কোড কোথায় আপডেট করতে হবে তা শনাক্ত করতে, আপনি একটি অস্থায়ী default নীতি নির্ধারণ করতে পারেন যা TrustedType-এর পরিবর্তে স্ট্রিং দিয়ে সিঙ্ক লেখা হলে লগ করে।
trustedTypes.createPolicy("default", {
createHTML(value) {
console.warn("String passed instead of Trusted Type.");
return DOMPurify.sanitize(value, { RETURN_TRUSTED_TYPE: false });
},
});
বিশ্বস্ত প্রকারকে সমর্থন করে এমন সাধারণ সিঙ্কগুলির মধ্যে রয়েছে:
- HTML:
element.innerHTML,element.outerHTML,document.write(),element.setHTMLUnsafe(),Document.parseHTMLUnsafe() - স্ক্রিপ্ট:
<script>টেক্সট কন্টেন্ট,eval() - ScriptURL:
<script src>,Worker(),SharedWorker()
// Assign the TrustedHTML object.
element.innerHTML = cleanHTML;
মনে রাখবেন যে "নিরাপদ" HTML স্যানিটাইজেশন পদ্ধতির (element.setHTML() এবং Document.parseHTML(), অবিশ্বস্ত HTML স্যানিটাইজ করা-এ কভার করা হয়েছে) জন্য বিশ্বস্ত প্রকারের নীতির প্রয়োজন হয় না, কারণ তারা সবসময় সম্ভাব্য XSS আক্রমণকে নেটিভভাবে স্যানিটাইজ করে।
৪. CSP-এর মাধ্যমে বিশ্বস্ত প্রকার এনফোর্স করা
আপনার অ্যাপ্লিকেশন যাতে ভেঙে না যায় তার জন্য বিশ্বস্ত প্রকারগুলি ক্রমবর্ধমানভাবে রোল আউট করা উচিত। সম্পূর্ণ এনফোর্সমেন্ট সবচেয়ে শক্তিশালী সুরক্ষা প্রদান করলেও, প্রতিটি সিঙ্ক রাইট মাইগ্রেট করা না হলে সাইট ভেঙে যাওয়ার ঝুঁকি থাকে।
পূর্বশর্ত
- ফ্রেমওয়ার্ক কো-অপারেশন: আপনার অ্যাপ্লিকেশনের ফ্রেমওয়ার্ক (বা DOM সিঙ্কে রাইট করে এমন কোনও থার্ড-পার্টি লাইব্রেরি) যদি
TrustedHTMLবাTrustedScriptভ্যালু তৈরি না করে, তাহলে সেই কোড না ভেঙে আপনি বিশ্বস্ত প্রকার এনফোর্স করতে পারবেন না। রোল-আউট শুরু করার আগে অডিট ফ্রেমওয়ার্ক সাপোর্ট। - সিঙ্ক রিফ্যাক্টর করা: আপনার বিশ্বস্ত প্রকার নীতি ব্যবহার করার জন্য আপনি বিপজ্জনক সিঙ্ক শনাক্ত এবং রিফ্যাক্টর করেছেন কিনা তা নিশ্চিত করুন।
রোলআউট স্ট্র্যাটেজি
শুধু রিপোর্ট করার জন্য: প্রথমে,
Content-Security-Policy-Report-Onlyহেডার ব্যবহার করে রোল-আউট করুন। এটি আসলে রাইট ব্লক না করেই আপনার রিপোর্টিং এন্ডপয়েন্টে লঙ্ঘন লগ করবে।Content-Security-Policy-Report-Only: require-trusted-types-for 'script';এনফোর্সমেন্ট: আপনার নীতি ইন্টিগ্রেট করা হয়ে গেলে এবং লঙ্ঘনের রিপোর্ট শূন্যে নেমে এলে, সম্পূর্ণ এনফোর্সমেন্টে যান।
Content-Security-Policy: require-trusted-types-for 'script';
এছাড়াও, কোন কোন নীতি তৈরি করার অনুমতি দেওয়া হবে তা আপনি সীমাবদ্ধ করতে পারবেন (আপনার নীতির নাম তালিকাভুক্ত করুন, যেমন sanitize-html বা escape-html, আপনার নীতি DOMPurify.sanitize()-এ ডেলিগেট করলে dompurify অন্তর্ভুক্ত করুন—যা ইন্টার্নালি একটি dompurify নীতি তৈরি করে—এবং মাইগ্রেশনের সময় ডিফল্ট নীতি রেজিস্টার করলে default অন্তর্ভুক্ত করুন):
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types sanitize-html escape-html dompurify;
এই CSP থাকলে, বিশ্বস্ত প্রকার ব্যবহার করে না এমন সিঙ্কে কিছু লিখলে তা একটি ত্রুটি দেখাবে। এছাড়াও, trusted-types-এ তালিকাভুক্ত নয় এমন নাম দিয়ে বিশ্বস্ত ধরনের নীতি তৈরি করার চেষ্টা করলে একটি সমস্যা দেখা দেবে।
এছাড়াও, আপনি এই CSP-কে আপনার ডকুমেন্টের <head>-এ <meta> ট্যাগ হিসেবে সেট করতে পারেন, যদিও এটি তুলনামূলকভাবে কম সুরক্ষিত।
<!-- First child of `<head>`, as earlier tags will not enforce this CSP. -->
<meta
http-equiv="Content-Security-Policy"
content="require-trusted-types-for 'script'; trusted-types sanitize-html escape-html dompurify;"
/>
ফলব্যাক স্ট্র্যাটেজি
যেসব ব্রাউজারে এখনও বিশ্বস্ত প্রকার কাজ করে না, সেগুলির ক্ষেত্রে আপনার কোড যাতে ভেঙে না যায় এবং স্যানিটাইজেশনও প্রদান করে, তা নিশ্চিত করতে আপনি ন্যূনতম "tinyfill" ব্যবহার করতে পারেন।
if (!window.trustedTypes) {
window.trustedTypes = {
createPolicy: (name, rules) => rules,
};
}
এটি আপনাকে আজ বিশ্বস্ত প্রকারের প্যাটার্ন ব্যবহার করে আপনার কোড লিখতে দেয়। যেসব ব্রাউজার এই ধরনের নীতি সমর্থন করে সেগুলি এই ধরনের নীতি প্রয়োগ করবে, অন্যদিকে পুরনো ব্রাউজারগুলি মক নীতির মাধ্যমে আপনার স্যানিটাইজেশন লজিক কার্যকর করবে।
কোনও ব্রাউজার বিশ্বস্ত প্রকারকে সমর্থন না করলে, এটি কেবল TrustedHTML অবজেক্টগুলিকে স্ট্রিং হিসাবে বিবেচনা করবে (যদি tinyfill ব্যবহার করা হয়) বা সিঙ্ক লেভেলে এনফোর্সমেন্ট চেক থাকবে না।