বিশ্বস্ত প্রকারের সাথে DOM-ভিত্তিক ক্রস-সাইট স্ক্রিপ্টিং দুর্বলতা প্রতিরোধ করুন

ক্রজিসটফ কোটোভিচ
Krzysztof Kotowicz

ব্রাউজার সমর্থন

  • ক্রোম: 83।
  • প্রান্ত: 83।
  • ফায়ারফক্স: সমর্থিত নয়।
  • সাফারি: সমর্থিত নয়।

উৎস

DOM-ভিত্তিক ক্রস-সাইট স্ক্রিপ্টিং (DOM XSS) ঘটে যখন একটি ব্যবহারকারী-নিয়ন্ত্রিত উত্স থেকে ডেটা (যেমন একটি ব্যবহারকারীর নাম, বা URL খণ্ড থেকে নেওয়া একটি পুনঃনির্দেশিত URL) একটি সিঙ্কে পৌঁছায়, যা eval() বা একটি সম্পত্তির মতো একটি ফাংশন সেটার যেমন .innerHTML যা নির্বিচারে জাভাস্ক্রিপ্ট কোড চালাতে পারে।

DOM XSS হল সবচেয়ে সাধারণ ওয়েব নিরাপত্তা দুর্বলতাগুলির মধ্যে একটি, এবং ডেভ টিমের জন্য এটি তাদের অ্যাপে ভুলবশত প্রবর্তন করা সাধারণ। বিশ্বস্ত প্রকারগুলি আপনাকে ডিফল্টরূপে বিপজ্জনক ওয়েব API ফাংশনগুলিকে সুরক্ষিত করে DOM XSS দুর্বলতাগুলি থেকে মুক্ত রাখতে, সুরক্ষা পর্যালোচনা এবং অ্যাপ্লিকেশনগুলিকে রাখার সরঞ্জাম দেয়৷ বিশ্বস্ত প্রকারগুলি এখনও তাদের সমর্থন করে না এমন ব্রাউজারগুলির জন্য একটি পলিফিল হিসাবে উপলব্ধ৷

পটভূমি

বহু বছর ধরে DOM XSS হল সবচেয়ে প্রচলিত এবং বিপজ্জনক ওয়েব নিরাপত্তা দুর্বলতাগুলির মধ্যে একটি।

ক্রস-সাইট স্ক্রিপ্টিং দুই ধরনের আছে। কিছু XSS দুর্বলতা সার্ভার-সাইড কোড দ্বারা সৃষ্ট হয় যা অনিরাপদভাবে ওয়েবসাইট গঠনকারী HTML কোড তৈরি করে। অন্যদের ক্লায়েন্টের একটি মূল কারণ রয়েছে, যেখানে জাভাস্ক্রিপ্ট কোড ব্যবহারকারী-নিয়ন্ত্রিত সামগ্রী সহ বিপজ্জনক ফাংশনগুলিকে কল করে।

সার্ভার-সাইড XSS প্রতিরোধ করতে, স্ট্রিংগুলি সংযুক্ত করে HTML তৈরি করবেন না। অতিরিক্ত বাগ প্রশমনের জন্য একটি অ-ভিত্তিক বিষয়বস্তু নিরাপত্তা নীতি সহ এর পরিবর্তে নিরাপদ প্রাসঙ্গিক-অটো-স্কেপিং টেমপ্লেটিং লাইব্রেরি ব্যবহার করুন।

এখন ব্রাউজারগুলি বিশ্বস্ত প্রকারগুলি ব্যবহার করে ক্লায়েন্ট-সাইড DOM-ভিত্তিক XSS প্রতিরোধে সহায়তা করতে পারে৷

API ভূমিকা

বিশ্বস্ত প্রকারগুলি নিম্নলিখিত ঝুঁকিপূর্ণ সিঙ্ক ফাংশনগুলি লক করে কাজ করে৷ আপনি ইতিমধ্যেই তাদের কিছু চিনতে পারেন, কারণ ব্রাউজার বিক্রেতা এবং ওয়েব ফ্রেমওয়ার্ক ইতিমধ্যেই নিরাপত্তার কারণে এই বৈশিষ্ট্যগুলি ব্যবহার করা থেকে আপনাকে দূরে সরিয়ে দেয়।

বিশ্বস্ত প্রকারের জন্য আপনাকে এই সিঙ্ক ফাংশনে পাঠানোর আগে ডেটা প্রক্রিয়া করতে হবে। শুধুমাত্র একটি স্ট্রিং ব্যবহার করা ব্যর্থ হয়, কারণ ব্রাউজার জানে না ডেটা বিশ্বাসযোগ্য কিনা:

করবেন না
anElement.innerHTML  = location.href;
বিশ্বস্ত প্রকারগুলি সক্ষম করে, ব্রাউজারটি একটি টাইপইরর ছুড়ে দেয় এবং একটি স্ট্রিং সহ একটি DOM XSS সিঙ্কের ব্যবহার প্রতিরোধ করে৷

ডেটা নিরাপদে প্রক্রিয়া করা হয়েছে তা বোঝাতে, একটি বিশেষ বস্তু তৈরি করুন - একটি বিশ্বস্ত প্রকার।

করবেন
anElement.innerHTML = aTrustedHTML;
  
বিশ্বস্ত প্রকারগুলি সক্ষম করার সাথে, ব্রাউজারটি এইচটিএমএল স্নিপেটগুলি আশা করে এমন সিঙ্কগুলির জন্য একটি TrustedHTML অবজেক্ট গ্রহণ করে৷ এছাড়াও অন্যান্য সংবেদনশীল সিঙ্কের জন্য TrustedScript এবং TrustedScriptURL অবজেক্ট রয়েছে।

বিশ্বস্ত প্রকারগুলি আপনার অ্যাপ্লিকেশনের DOM XSS আক্রমণ পৃষ্ঠকে উল্লেখযোগ্যভাবে হ্রাস করে। এটি নিরাপত্তা পর্যালোচনাকে সহজ করে, এবং ব্রাউজারে রানটাইমে আপনার কোড কম্পাইল, লিন্টিং বা বান্ডলিং করার সময় টাইপ-ভিত্তিক নিরাপত্তা চেকগুলি প্রয়োগ করতে দেয়৷

বিশ্বস্ত প্রকারগুলি কীভাবে ব্যবহার করবেন

বিষয়বস্তু নিরাপত্তা নীতি লঙ্ঘন প্রতিবেদনের জন্য প্রস্তুত করুন

আপনি একটি প্রতিবেদন সংগ্রাহক স্থাপন করতে পারেন, যেমন ওপেন-সোর্স রিপোর্টিং-এপিআই-প্রসেসর বা go-csp-সংগ্রাহক , অথবা বাণিজ্যিক সমতুল্যগুলির একটি ব্যবহার করতে পারেন৷ আপনি একটি ReportingObserver ব্যবহার করে ব্রাউজারে কাস্টম লগিং এবং ডিবাগ লঙ্ঘন যোগ করতে পারেন:

const observer = new ReportingObserver((reports, observer) => {
    for (const report of reports) {
        if (report.type !== 'csp-violation' ||
            report.body.effectiveDirective !== 'require-trusted-types-for') {
            continue;
        }

        const violation = report.body;
        console.log('Trusted Types Violation:', violation);

        // ... (rest of your logging and reporting logic)
    }
}, { buffered: true });

observer.observe();

অথবা একটি ইভেন্ট শ্রোতা যোগ করে:

document.addEventListener('securitypolicyviolation',
    console.error.bind(console));

একটি রিপোর্ট-শুধু CSP শিরোনাম যোগ করুন

আপনি বিশ্বস্ত প্রকারগুলিতে স্থানান্তরিত করতে চান এমন নথিগুলিতে নিম্নলিখিত HTTP প্রতিক্রিয়া শিরোনাম যুক্ত করুন:

Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri //my-csp-endpoint.example

এখন সমস্ত লঙ্ঘন //my-csp-endpoint.example এ রিপোর্ট করা হয়েছে, কিন্তু ওয়েবসাইটটি কাজ চালিয়ে যাচ্ছে। পরবর্তী বিভাগে ব্যাখ্যা করা হয়েছে কিভাবে //my-csp-endpoint.example কাজ করে।

বিশ্বস্ত প্রকার লঙ্ঘন সনাক্ত করুন

এখন থেকে, যতবার বিশ্বস্ত প্রকারগুলি লঙ্ঘন শনাক্ত করে, ব্রাউজার একটি কনফিগার করা report-uri একটি প্রতিবেদন পাঠায়। উদাহরণস্বরূপ, যখন আপনার অ্যাপ্লিকেশন innerHTML এ একটি স্ট্রিং পাস করে, তখন ব্রাউজার নিম্নলিখিত প্রতিবেদন পাঠায়:

{
"csp-report": {
    "document-uri": "https://my.url.example",
    "violated-directive": "require-trusted-types-for",
    "disposition": "report",
    "blocked-uri": "trusted-types-sink",
    "line-number": 39,
    "column-number": 12,
    "source-file": "https://my.url.example/script.js",
    "status-code": 0,
    "script-sample": "Element innerHTML <img src=x"
}
}

এটি বলে যে https://my.url.example/script.js লাইনে 39, innerHTML <img src=x দিয়ে শুরু হওয়া স্ট্রিং দিয়ে কল করা হয়েছিল। এই তথ্যটি আপনাকে কোডের কোন অংশগুলি DOM XSS প্রবর্তন করতে পারে এবং পরিবর্তন করতে হবে তা সংকুচিত করতে সহায়তা করবে।

লঙ্ঘনগুলি ঠিক করুন

একটি বিশ্বস্ত প্রকার লঙ্ঘন ঠিক করার জন্য কয়েকটি বিকল্প রয়েছে৷ আপনি আপত্তিকর কোডটি সরাতে পারেন, একটি লাইব্রেরি ব্যবহার করতে পারেন , একটি বিশ্বস্ত প্রকার নীতি তৈরি করতে পারেন বা শেষ অবলম্বন হিসাবে, একটি ডিফল্ট নীতি তৈরি করতে পারেন

আপত্তিকর কোড পুনরায় লিখুন

এটা সম্ভব যে নন-কনফর্মিং কোডের আর প্রয়োজন নেই, বা লঙ্ঘন ঘটায় এমন ফাংশন ছাড়াই পুনরায় লেখা যেতে পারে:

করবেন
el.textContent = '';
const img = document.createElement('img');
img.src = 'xyz.jpg';
el.appendChild(img);
করবেন না
el.innerHTML = '<img src=xyz.jpg>';

একটি লাইব্রেরি ব্যবহার করুন

কিছু লাইব্রেরি ইতিমধ্যেই বিশ্বস্ত প্রকার তৈরি করে যা আপনি সিঙ্ক ফাংশনে পাস করতে পারেন। উদাহরণস্বরূপ, আপনি একটি HTML স্নিপেট স্যানিটাইজ করার জন্য DOMpurify ব্যবহার করতে পারেন, XSS পেলোডগুলি সরিয়ে ফেলতে পারেন।

import DOMPurify from 'dompurify';
el.innerHTML = DOMPurify.sanitize(html, {RETURN_TRUSTED_TYPE: true});

DOMPurify বিশ্বস্ত প্রকারগুলিকে সমর্থন করে এবং একটি TrustedHTML অবজেক্টে মোড়ানো স্যানিটাইজড HTML ফেরত দেয় যাতে ব্রাউজার কোনও লঙ্ঘন না করে।

একটি বিশ্বস্ত টাইপ নীতি তৈরি করুন

কখনও কখনও আপনি লঙ্ঘন ঘটাচ্ছে এমন কোডটি সরাতে পারবেন না এবং মানটিকে স্যানিটাইজ করার এবং আপনার জন্য একটি বিশ্বস্ত প্রকার তৈরি করার জন্য কোনও লাইব্রেরি নেই৷ এই ক্ষেত্রে, আপনি নিজেই একটি বিশ্বস্ত টাইপ অবজেক্ট তৈরি করতে পারেন।

প্রথমত, একটি নীতি তৈরি করুন। নীতিগুলি হল বিশ্বস্ত প্রকারের কারখানা যা তাদের ইনপুটে কিছু নিরাপত্তা নিয়ম প্রয়োগ করে:

if (window.trustedTypes && trustedTypes.createPolicy) { // Feature testing
  const escapeHTMLPolicy = trustedTypes.createPolicy('myEscapePolicy', {
    createHTML: string => string.replace(/\</g, '&lt;')
  });
}

এই কোডটি myEscapePolicy নামে একটি নীতি তৈরি করে যা এর createHTML() ফাংশন ব্যবহার করে TrustedHTML অবজেক্ট তৈরি করতে পারে। সংজ্ঞায়িত নিয়ম এইচটিএমএল-এসকেপ < অক্ষর নতুন এইচটিএমএল উপাদান তৈরি রোধ করতে.

এই মত নীতি ব্যবহার করুন:

const escaped = escapeHTMLPolicy.createHTML('<img src=x onerror=alert(1)>');
console.log(escaped instanceof TrustedHTML);  // true
el.innerHTML = escaped;  // '&lt;img src=x onerror=alert(1)>'

একটি ডিফল্ট নীতি ব্যবহার করুন

কখনও কখনও আপনি আপত্তিকর কোড পরিবর্তন করতে পারবেন না, উদাহরণস্বরূপ, যদি আপনি একটি CDN থেকে তৃতীয় পক্ষের লাইব্রেরি লোড করছেন৷ সেই ক্ষেত্রে, একটি ডিফল্ট নীতি ব্যবহার করুন:

if (window.trustedTypes && trustedTypes.createPolicy) { // Feature testing
  trustedTypes.createPolicy('default', {
    createHTML: (string, sink) => DOMPurify.sanitize(string, {RETURN_TRUSTED_TYPE: true})
  });
}

default নামের নীতিটি ব্যবহার করা হয় যেখানে একটি সিঙ্কে একটি স্ট্রিং ব্যবহার করা হয় যা শুধুমাত্র বিশ্বস্ত প্রকারকে গ্রহণ করে।

কন্টেন্ট নিরাপত্তা নীতি প্রয়োগ করার জন্য স্যুইচ করুন

যখন আপনার অ্যাপ্লিকেশন আর লঙ্ঘন তৈরি করে না, তখন আপনি বিশ্বস্ত প্রকারগুলি প্রয়োগ করা শুরু করতে পারেন:

Content-Security-Policy: require-trusted-types-for 'script'; report-uri //my-csp-endpoint.example

এখন, আপনার ওয়েব অ্যাপ্লিকেশন যতই জটিল হোক না কেন, একমাত্র যে জিনিসটি একটি DOM XSS দুর্বলতার পরিচয় দিতে পারে তা হল আপনার একটি নীতির কোড, এবং আপনি নীতি তৈরিকে সীমিত করে এটিকে আরও লক করতে পারেন৷

আরও পড়া