Content Security Policy और आपका CMP: CSP और सहमति को साथ काम कराना
दो सुरक्षा परतें जिन्हें सहमत होना होगा
Content Security Policy (CSP) ब्राउज़र को बताती है कि कोई पेज किन स्रोतों से स्क्रिप्ट, स्टाइल, इमेज, फ़्रेम और नेटवर्क अनुरोध लोड कर सकता है। सहमति प्रबंधन प्लेटफ़ॉर्म इसका उलटा काम करता है: वह उपयोगकर्ता की पसंद के आधार पर तय करता है कि उन स्क्रिप्ट में से कौन-सी चलने दी जाएँ। जब दोनों अलग-अलग कॉन्फ़िगर किए जाते हैं, तो वे टकराते हैं। CMP लोड नहीं हो पाता क्योंकि CSP उसे रोक देती है, या 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 बदलाव उसे निष्क्रिय न कर सकें।