Content Security Policy ও আপনার CMP: CSP আর সম্মতিকে একসঙ্গে কাজ করানো
দুটি নিরাপত্তা স্তর যাদের একমত হতে হবে
Content Security Policy (CSP) ব্রাউজারকে জানায় একটি পেজ কোন উৎস থেকে স্ক্রিপ্ট, স্টাইল, ছবি, ফ্রেম ও নেটওয়ার্ক অনুরোধ লোড করতে পারবে। সম্মতি ব্যবস্থাপনা প্ল্যাটফর্ম করে এর উল্টো কাজ: ব্যবহারকারীর পছন্দের ভিত্তিতে ঠিক করে সেই স্ক্রিপ্টগুলোর মধ্যে কোনটি চলতে পারবে। দুটি আলাদাভাবে কনফিগার করা হলে সংঘাত বাধে। CSP আটকে দেওয়ায় CMP লোড হয় না, অথবা CMP ও বিজ্ঞাপন ট্যাগ মানিয়ে নিতে CSP এত শিথিল করা হয় যে তা আর কিছুই রক্ষা করে না।
এই গাইডে ব্যাখ্যা করা হয়েছে একটি CMP-র সাধারণত কোন CSP ডিরেক্টিভ লাগে, স্ক্রিপ্ট ইনজেকশনের সঙ্গে ননস কীভাবে কাজ করে, এবং ব্যানার না ভেঙে পরিবর্তন কীভাবে রোলআউট করবেন।
CMP সাধারণত CSP থেকে কী চায়
সুনির্দিষ্ট প্রয়োজন ভেন্ডরভেদে আলাদা, তাই সবসময় আপনার CMP-র নিজস্ব ডকুমেন্টেশন থেকে শুরু করুন। সাধারণভাবে এই ডিরেক্টিভগুলো দেখুন:
script-src— যে ডোমেন থেকে CMP স্ক্রিপ্ট লোড হয়, সঙ্গে সে যেসব অতিরিক্ত স্ক্রিপ্ট ফাইল লোড করে।connect-src— যেসব এন্ডপয়েন্টে CMPfetchবা XHR দিয়ে কল করে, যেমন কনফিগারেশন, ভেন্ডর তালিকা, জিওলোকেশন ও সম্মতি লগিং এন্ডপয়েন্ট।style-src— স্টাইলশিট ডোমেন, এবং CMP<style>এলিমেন্ট ইনজেক্ট করলে বা স্টাইল অ্যাট্রিবিউট সেট করলে সম্ভবত ইনলাইন স্টাইলও।img-src— লোগো, আইকন এবং CMP-র ব্যবহৃত ট্র্যাকিংমুক্ত পিক্সেল।font-src— ব্যানার নিজস্ব ফন্ট লোড করলে।frame-src— CMP iframe ব্যবহার করলে, যেমন ক্রস-ডোমেন সম্মতি ভাগ করার জন্য।
TCF সাইটে মনে রাখুন, CMP পেজে __tcfapiLocator নামে একটি লোকেটার ফ্রেমও তৈরি করে। সেই ফ্রেম দূরবর্তী উৎস ছাড়াই তৈরি হয়, তাই সাধারণত তার জন্য frame-src এন্ট্রি লাগে না, তবু পরীক্ষায় তা নিশ্চিত করা ভালো।
ইনলাইন স্টাবের সমস্যা
বেশির ভাগ CMP আপনাকে পেজের হেডে একটি ছোট ইনলাইন স্ক্রিপ্ট — স্টাব — বসাতে বলে, যাতে মূল CMP লোড হওয়ার আগে অন্য স্ক্রিপ্ট কল কিউতে রাখতে পারে। কঠোর CSP স্পষ্টভাবে অনুমতি না দিলে ইনলাইন স্ক্রিপ্ট আটকে দেয়। আপনার তিনটি বিকল্প:
- ননস। প্রতিটি রেসপন্সের জন্য একটি এলোমেলো মান তৈরি করে CSP হেডারে
'nonce-...'হিসেবে এবং স্টাবের<script>ট্যাগে যোগ করুন। গতিশীল পেজের জন্য এটি সবচেয়ে নমনীয় বিকল্প। - হ্যাশ। স্টাবের হুবহু বিষয়বস্তুর SHA-256 হ্যাশ
script-src-এ যোগ করুন। স্ট্যাটিক সাইটে এটি ভালো কাজ করে, কিন্তু স্টাবে যেকোনো পরিবর্তন, এমনকি ফাঁকা জায়গা, এটি ভেঙে দেয়। - স্টাব নিজে হোস্ট করা, নিজের ডোমেনে বাহ্যিক ফাইল হিসেবে, যা
'self'-এর আওতায় পড়ে। যথেষ্ট আগে লোড হচ্ছে তা নিশ্চিত করতে এতে যত্ন লাগে।
শর্টকাট হিসেবে 'unsafe-inline' এড়িয়ে চলুন। এটি প্রতিটি ইনলাইন স্ক্রিপ্টকে অনুমতি দেয়, ফলে CSP যে সুরক্ষা দেয় তার বড় অংশ চলে যায়।
ননস এবং CMP-র ইনজেক্ট করা স্ক্রিপ্ট
যে CMP সম্মতি না পাওয়া পর্যন্ত স্ক্রিপ্ট আটকে রাখে, সে প্রায়ই সেগুলো ধরে রেখে পরে ইনজেক্ট করার মাধ্যমে কাজ করে। ননসভিত্তিক CSP-তে সেই ইনজেক্ট করা স্ক্রিপ্টগুলোকেও অনুমতি দিতে হয়। দুটি প্রচলিত পদ্ধতি:
- ননস প্রসারণ। CMP তার নিজের স্ক্রিপ্ট ট্যাগ থেকে ননস পড়ে এবং ইনজেক্ট করা প্রতিটি স্ক্রিপ্টে যোগ করে। আপনার CMP এটি সমর্থন করে কি না যাচাই করুন।
'strict-dynamic'। এই কিওয়ার্ড সমর্থনকারী ব্রাউজারদের বলে, ইতিমধ্যে বিশ্বস্ত কোনো স্ক্রিপ্টের লোড করা স্ক্রিপ্টে আস্থা রাখতে। এটি ট্যাগ ম্যানেজার ও স্ক্রিপ্ট ইনজেক্ট করা CMP-র ক্ষেত্রে জীবন সহজ করে, কিন্তু এর অর্থ আপনার বিশ্বস্ত যেকোনো স্ক্রিপ্ট অন্যদের লোড করতে পারে, তাই ভেবেচিন্তে আস্থা রাখুন।
ট্যাগ ম্যানেজারও একই প্রশ্ন তোলে। বিজ্ঞাপন ও অ্যানালিটিক্স ট্যাগ ট্যাগ ম্যানেজার দিয়ে লোড করলে ননস নিয়ে তার ডকুমেন্টেশন অনুসরণ করুন এবং নিশ্চিত করুন CMP ও ট্যাগ ম্যানেজার একই পদ্ধতি ব্যবহার করছে।
বিজ্ঞাপন ট্যাগ CSP-কে কঠিন করে
প্রোগ্রামেটিক বিজ্ঞাপন বহু ডোমেন থেকে স্ক্রিপ্ট ও ফ্রেম লোড করে, এবং ডিমান্ড পার্টনার বদলালে তালিকা বদলায়। প্রকাশকরা সাধারণত দুটির একটি বেছে নেন:
- প্রোগ্রামেটিক বিজ্ঞাপনহীন পেজে কঠোর CSP, আর যেখানে বিজ্ঞাপন চলে সেখানে আরও প্রশস্ত নীতি।
- যেসব ডিরেক্টিভ পরিচালনাযোগ্য থাকে তার ওপর কেন্দ্রীভূত নীতি, যেমন
frame-ancestors,object-src 'none'ওbase-uri, আর স্ক্রিপ্ট উৎস প্রশস্ত থাকে।
যেটিই হোক, CMP স্পষ্ট অনুমতি তালিকায় থাকা উচিত, শুধু ওয়াইল্ডকার্ডের আওতায় নয়, যাতে CSP-র কোনো পরিবর্তন নিঃশব্দে ব্যানার অক্ষম করে না দেয়।
রিপোর্ট-অনলি মোডে রোলআউট করুন
প্রথমে Content-Security-Policy-Report-Only হেডার ব্যবহার করুন। ব্রাউজার কিছু না আটকে লঙ্ঘন রিপোর্ট করে, ফলে নতুন নীতি কী ভাঙবে তা আপনি দেখতে পারেন।
- রিপোর্টিং এন্ডপয়েন্ট সহ নীতিটি রিপোর্ট-অনলি মোডে ডিপ্লয় করুন।
- পরিষ্কার ব্রাউজার প্রোফাইলে পেজ লোড করে পূর্ণ সম্মতি প্রবাহ চালান: প্রথম ভিজিট, সব গ্রহণ, সব প্রত্যাখ্যান, কাস্টম পছন্দ, প্রত্যাহার।
- লঙ্ঘনের রিপোর্ট এবং ব্রাউজার কনসোলে আটকে যাওয়া CMP রিসোর্স দেখুন।
- নীতি সমন্বয় করুন, তারপর বলবৎ মোডে যান।
- বলবৎ করার পরও রিপোর্টিং চালু রাখুন যাতে রিগ্রেশন ধরা পড়ে।
CSP সংঘাতের লক্ষণ
- ব্যানার কখনও দেখা যায় না, আর কনসোল CMP স্ক্রিপ্টের জন্য CSP লঙ্ঘন দেখায়।
- ব্যানার আসে কিন্তু স্টাইলহীন, কারণ
style-srcতার CSS আটকে দিচ্ছে। - পছন্দ সংরক্ষিত হয় না, কারণ
connect-srcসম্মতি লগিং কল আটকে দিচ্ছে। - সম্মতির পর বিজ্ঞাপন বা অ্যানালিটিক্স কখনও লোড হয় না, কারণ ইনজেক্ট করা স্ক্রিপ্টে ননস নেই।
__tcfapiসংজ্ঞায়িত নয়, কারণ ইনলাইন স্টাব আটকে দেওয়া হয়েছিল।
মূল বিষয়গুলো
- আপনার CMP-র জন্য
script-src,connect-src,style-src,img-srcওframe-srcযাচাই করুন। - ইনলাইন স্টাবকে ননস বা হ্যাশ দিয়ে অনুমতি দিন,
'unsafe-inline'দিয়ে নয়। - সম্মতির পর ইনজেক্ট করা স্ক্রিপ্ট যেন ননস পায় বা
'strict-dynamic'-এর আওতায় থাকে তা নিশ্চিত করুন। - বলবৎ করার আগে রিপোর্ট-অনলি মোডে প্রতিটি সম্মতি পথ পরীক্ষা করুন।
- CMP-কে স্পষ্টভাবে অনুমতি তালিকায় রাখুন যাতে CSP পরিবর্তন তাকে অক্ষম করতে না পারে।