کنٹینٹ سیکیورٹی پالیسی اور آپ کا CMP: CSP اور رضامندی کو ساتھ چلانا
دو سیکیورٹی تہیں جنہیں ہم آہنگ ہونا ہے
کنٹینٹ سیکیورٹی پالیسی (CSP) براؤزر کو بتاتی ہے کہ کوئی صفحہ کن ذرائع سے اسکرپٹس، اسٹائلز، تصاویر، فریمز اور نیٹ ورک درخواستیں لوڈ کر سکتا ہے۔ رضامندی کے انتظام کا پلیٹ فارم اس کے برعکس کام کرتا ہے: وہ صارف کے انتخاب کی بنیاد پر طے کرتا ہے کہ ان میں سے کن اسکرپٹس کو چلنے کی اجازت ہے۔ جب دونوں الگ الگ ترتیب دیے جائیں تو ٹکراتے ہیں۔ یا تو CMP لوڈ نہیں ہوتا کیونکہ CSP اسے بلاک کر دیتی ہے، یا CSP کو CMP اور اشتہاری ٹیگز کی گنجائش کے لیے اتنا ڈھیلا کر دیا جاتا ہے کہ وہ کسی چیز کی حفاظت ہی نہیں کرتی۔
یہ گائیڈ بتاتی ہے کہ CMP کو عموماً کن CSP ڈائریکٹوز کی ضرورت ہوتی ہے، nonces اسکرپٹ انجیکشن کے ساتھ کیسے تعامل کرتے ہیں، اور بینر کو توڑے بغیر تبدیلیاں کیسے رول آؤٹ کی جائیں۔
CMP کو عموماً CSP سے کیا چاہیے
عین تقاضے وینڈر پر منحصر ہیں، اس لیے ہمیشہ اپنے CMP کی دستاویزات سے آغاز کریں۔ عمومی طور پر ان ڈائریکٹوز کو چیک کریں:
script-src— وہ ڈومین جہاں سے CMP اسکرپٹ لوڈ ہوتا ہے، نیز کوئی بھی اضافی اسکرپٹ فائلیں جو وہ لوڈ کرتا ہے۔connect-src— وہ اینڈ پوائنٹس جنہیں CMPfetchیا XHR سے کال کرتا ہے، جیسے کنفیگریشن، وینڈر لسٹ، جغرافیائی مقام اور رضامندی لاگنگ۔style-src— اسٹائل شیٹ کا ڈومین، اور ممکنہ طور پر ان لائن اسٹائلز اگر CMP<style>ایلیمنٹ انجیکٹ کرتا ہے یا style ایٹریبیوٹس سیٹ کرتا ہے۔img-src— لوگوز، آئیکنز اور CMP کے استعمال کردہ کوئی بھی ٹریکنگ سے پاک پکسلز۔font-src— اگر بینر اپنے فونٹس لوڈ کرتا ہے۔frame-src— اگر CMP iframes استعمال کرتا ہے، مثلاً ڈومینز کے پار رضامندی کے اشتراک کے لیے۔
TCF سائٹس پر یاد رکھیں کہ CMP صفحے پر __tcfapiLocator نام کا ایک لوکیٹر فریم بھی بناتا ہے۔ یہ فریم بغیر ریموٹ سورس کے بنتا ہے، اس لیے عام طور پر اسے frame-src اندراج کی ضرورت نہیں ہوتی، لیکن ٹیسٹنگ میں تصدیق کر لینا مناسب ہے۔
ان لائن اسٹب کا مسئلہ
زیادہ تر CMPs آپ سے کہتے ہیں کہ صفحے کے head میں ایک چھوٹا ان لائن اسکرپٹ — اسٹب — رکھیں، تاکہ مرکزی CMP لوڈ ہونے سے پہلے دوسرے اسکرپٹس کالز کو قطار میں رکھ سکیں۔ سخت CSP ان لائن اسکرپٹس کو بلاک کرتی ہے جب تک آپ صراحت سے اجازت نہ دیں۔ آپ کے پاس تین راستے ہیں:
- nonce۔ ہر جواب کے لیے ایک بے ترتیب قدر بنائیں، اسے
'nonce-...'کی صورت میں CSP ہیڈر میں اور اسٹب کے<script>ٹیگ میں شامل کریں۔ متحرک صفحات کے لیے یہ سب سے لچکدار راستہ ہے۔ - ہیش۔ اسٹب کے عین مواد کا SHA-256 ہیش
script-srcمیں شامل کریں۔ یہ جامد سائٹس کے لیے اچھا کام کرتا ہے، لیکن اسٹب میں کوئی بھی تبدیلی، حتیٰ کہ خالی جگہ، اسے توڑ دیتی ہے۔ - اسٹب کی خود میزبانی اپنے ڈومین پر بیرونی فائل کے طور پر، جو
'self'سے ڈھکی ہو۔ اس کے لیے احتیاط چاہیے تاکہ وہ کافی جلدی لوڈ ہو۔
شارٹ کٹ کے طور پر 'unsafe-inline' سے بچیں۔ یہ ہر ان لائن اسکرپٹ کی اجازت دیتا ہے، جو CSP کی فراہم کردہ زیادہ تر حفاظت ختم کر دیتا ہے۔
Nonces اور وہ اسکرپٹس جو CMP انجیکٹ کرتا ہے
جو CMP رضامندی تک اسکرپٹس کو بلاک کرتا ہے وہ اکثر انہیں روک کر بعد میں انجیکٹ کرنے سے کام کرتا ہے۔ nonce پر مبنی CSP میں ان انجیکٹ شدہ اسکرپٹس کو بھی اجازت دینی ہوگی۔ دو عام طریقے ہیں:
- Nonce کی ترسیل۔ CMP اپنے اسکرپٹ ٹیگ سے nonce پڑھتا ہے اور ہر انجیکٹ شدہ اسکرپٹ میں شامل کرتا ہے۔ چیک کریں کہ آیا آپ کا CMP اسے سپورٹ کرتا ہے۔
'strict-dynamic'۔ یہ کلیدی لفظ معاون براؤزرز کو بتاتا ہے کہ پہلے سے قابلِ اعتماد اسکرپٹ کے لوڈ کردہ اسکرپٹس پر بھروسا کریں۔ یہ ٹیگ مینیجرز اور اسکرپٹ انجیکٹ کرنے والے CMPs کے ساتھ کام آسان کرتا ہے، لیکن اس کا مطلب یہ بھی ہے کہ آپ کا کوئی بھی قابلِ اعتماد اسکرپٹ دوسرے لوڈ کر سکتا ہے، اس لیے احتیاط سے بھروسا کریں۔
ٹیگ مینیجرز بھی یہی سوال اٹھاتے ہیں۔ اگر آپ اشتہاری اور اینالیٹکس ٹیگز ٹیگ مینیجر کے ذریعے لوڈ کرتے ہیں تو nonces پر اس کی دستاویزات کی پیروی کریں اور یقینی بنائیں کہ CMP اور ٹیگ مینیجر یکساں طریقہ اپناتے ہیں۔
اشتہاری ٹیگز CSP کو مشکل بناتے ہیں
پروگرامیٹک اشتہارات کئی ڈومینز سے اسکرپٹس اور فریمز لوڈ کرتے ہیں، اور ڈیمانڈ پارٹنرز بدلنے کے ساتھ فہرست بدلتی ہے۔ ناشرین عموماً دو میں سے ایک انتخاب کرتے ہیں:
- پروگرامیٹک اشتہارات کے بغیر صفحات پر سخت CSP، اور جہاں اشتہارات چلتے ہیں وہاں وسیع پالیسی۔
- ایسی پالیسی جو قابلِ انتظام رہنے والے ڈائریکٹوز پر مرکوز ہو، جیسے
frame-ancestors،object-src 'none'اورbase-uri، جبکہ اسکرپٹ کے ذرائع وسیع رہیں۔
دونوں صورتوں میں CMP کو صریح اجازت فہرست میں ہونا چاہیے، صرف وائلڈ کارڈ کے ذریعے نہیں، تاکہ CSP کی کوئی تبدیلی خاموشی سے بینر کو غیر فعال نہ کر دے۔
Report-Only موڈ کے ساتھ رول آؤٹ کریں
پہلے Content-Security-Policy-Report-Only ہیڈر استعمال کریں۔ براؤزر کچھ بلاک کیے بغیر خلاف ورزیاں رپورٹ کرتا ہے، تاکہ آپ دیکھ سکیں کہ نئی پالیسی کیا توڑے گی۔
- پالیسی کو report-only موڈ میں رپورٹنگ اینڈ پوائنٹ کے ساتھ تعینات کریں۔
- صاف براؤزر پروفائلز میں صفحات لوڈ کریں اور رضامندی کا پورا بہاؤ چلائیں: پہلی وزٹ، سب قبول کریں، سب مسترد کریں، حسب ضرورت انتخاب، رضامندی واپس لینا۔
- بلاک شدہ CMP وسائل کے لیے خلاف ورزی کی رپورٹس اور براؤزر کنسول کا جائزہ لیں۔
- پالیسی ایڈجسٹ کریں، پھر نفاذ پر جائیں۔
- پسپائی پکڑنے کے لیے نفاذ کے بعد بھی رپورٹنگ فعال رکھیں۔
CSP تصادم کی علامات
- بینر کبھی ظاہر نہیں ہوتا، اور کنسول CMP اسکرپٹ کے لیے CSP کی خلاف ورزی دکھاتا ہے۔
- بینر ظاہر ہوتا ہے لیکن بغیر اسٹائل کے، کیونکہ
style-srcاس کی CSS بلاک کرتا ہے۔ - انتخاب محفوظ نہیں ہوتے، کیونکہ
connect-srcرضامندی لاگنگ کال کو بلاک کرتا ہے۔ - رضامندی کے بعد اشتہارات یا اینالیٹکس کبھی لوڈ نہیں ہوتے، کیونکہ انجیکٹ شدہ اسکرپٹس میں nonce نہیں۔
__tcfapiغیر متعین ہے، کیونکہ ان لائن اسٹب بلاک ہو گیا تھا۔
اہم نکات
- اپنے CMP کے لیے
script-src،connect-src،style-src،img-srcاورframe-srcچیک کریں۔ - ان لائن اسٹب کو nonce یا ہیش سے اجازت دیں،
'unsafe-inline'سے نہیں۔ - یقینی بنائیں کہ رضامندی کے بعد انجیکٹ ہونے والے اسکرپٹس کو nonce ملے یا وہ
'strict-dynamic'کے دائرے میں ہوں۔ - نافذ کرنے سے پہلے رضامندی کے ہر راستے کو report-only موڈ میں ٹیسٹ کریں۔
- CMP کو صریح اجازت فہرست میں رکھیں تاکہ CSP کی تبدیلیاں اسے غیر فعال نہ کر سکیں۔