कॉन्टेंट की सुरक्षा के बारे में नीति (सीएसपी) से यह पक्का होता है कि पेज पर लोड किए गए हर कॉन्टेंट पर साइट के मालिक ने भरोसा किया है. सीएसपी, क्रॉस-साइट स्क्रिप्टिंग (XSS) के हमलों को कम करते हैं, क्योंकि ये हमलावरों से असुरक्षित स्क्रिप्ट को ब्लॉक कर सकते हैं. हालांकि, अगर सीएसपी सख्त नहीं है, तो उसे आसानी से बायपास किया जा सकता है. ज़्यादा जानकारी के लिए, कॉन्टेंट की सुरक्षा के बारे में सख्त नीति (सीएसपी) का इस्तेमाल करके, क्रॉस-साइट स्क्रिप्टिंग (XSS) को कम करना लेख देखें. लाइटहाउस, मुख्य दस्तावेज़ पर लागू किए गए सीएसपी इकट्ठा करता है. साथ ही, अगर उन्हें बायपास किया जा सकता है, तो सीएसपी इवैलुएटर की ओर से समस्याओं की रिपोर्ट करता है.
बायपास न किए जा सकने वाले सीएसपी के लिए ज़रूरी तरीके
नीचे दिए गए तरीके लागू करके पक्का करें कि आपके सीएसपी को बायपास न किया जा सके. अगर सीएसपी को बायपास किया जा सकता है, तो लाइटहाउस ज़्यादा गंभीरता की चेतावनी देगा.
सीएसपी, XSS को टारगेट करता है
XSS को टारगेट करने के लिए, सीएसपी में script-src
, object-src
, और base-uri
डायरेक्टिव शामिल होने चाहिए. सीएसपी में सिंटैक्स की कोई गड़बड़ी भी नहीं होनी चाहिए.
script-src
और object-src
, किसी पेज को असुरक्षित स्क्रिप्ट और असुरक्षित प्लगिन से सुरक्षित करते हैं. इसके अलावा, script-src
और object-src
जैसे कई डायरेक्टिव की जगह, default-src
का इस्तेमाल एक ज़्यादा नीति को कॉन्फ़िगर करने के लिए किया जा सकता है.
base-uri
बिना अनुमति वाले <base>
टैग को डालने से रोकता है. इनका इस्तेमाल सभी मिलते-जुलते यूआरएल (जैसे कि स्क्रिप्ट) को हमलावर के कंट्रोल वाले डोमेन पर रीडायरेक्ट करने के लिए किया जा सकता है.
सीएसपी, अनुमति वाली सूची को बायपास करने से रोकने के लिए, नॉन्स या हैश का इस्तेमाल करता है
script-src
के लिए, अनुमति वाले डोमेन की सूची कॉन्फ़िगर करने वाला सीएसपी, इस हिसाब से काम करता है कि किसी भरोसेमंद डोमेन से मिलने वाले सभी जवाब सुरक्षित हैं. साथ ही, उन्हें स्क्रिप्ट के तौर पर इस्तेमाल किया जा सकता है. हालांकि, यह अनुमान आधुनिक ऐप्लिकेशन पर लागू नहीं होता. कुछ सामान्य और आसान पैटर्न, जैसे कि JSONP इंटरफ़ेस को सार्वजनिक करना और AngularJS लाइब्रेरी की होस्टिंग कॉपी को शामिल करने पर, हमलावर सीएसपी की सीमाओं से बच सकते हैं.
ऐसा हो सकता है कि ऐप्लिकेशन बनाने वाले लोगों को यह साफ़ तौर पर पता न चले कि script-src
की अनुमति वाली सूची में शामिल ज़्यादातर साइटों को हैक किया जा सकता है. ऐसे हमलावर को XSS बग का पता चलता है और यह उन्हें स्क्रिप्ट इंजेक्शन से बचाता है. वहीं दूसरी ओर, नॉन-आधारित और हैश-आधारित तरीकों पर ये समस्याएं नहीं आतीं. इनकी वजह से, ज़्यादा सुरक्षित नीति को अपनाना और उसे बनाए रखना आसान हो जाता है.
उदाहरण के लिए, यह कोड किसी भरोसेमंद डोमेन पर होस्ट किए गए JSONP एंडपॉइंट का इस्तेमाल करता है, ताकि हमलावर के कंट्रोल वाली स्क्रिप्ट को इंजेक्ट किया जा सके:
सीएसपी:
script-src https://trusted.example.com
HTML:
<script src="https://trusted.example.com/path/jsonp?callback=alert(document.domain)//"></script>
बायपास से बचने के लिए, सीएसपी को नॉन्स या हैश का इस्तेमाल करके, अलग-अलग स्क्रिप्ट को अनुमति देनी चाहिए. साथ ही, अनुमति वाली सूची के बजाय 'strict-Dynamic' का इस्तेमाल करना चाहिए.
सुरक्षित सीएसपी के लिए अतिरिक्त सुझाव
बेहतर सुरक्षा और अन्य सुविधाओं के साथ काम करने के लिए, यहां दिए गए तरीके अपनाएं. अगर सीएसपी इनमें से किसी भी सुझाव का पालन नहीं करता है, तो लाइटहाउस कुछ हद तक गंभीर चेतावनी देगा.
सीएसपी रिपोर्टिंग कॉन्फ़िगर करें
रिपोर्टिंग डेस्टिनेशन कॉन्फ़िगर करने से, किसी भी तरह के रुकावट के लिए निगरानी करने में मदद मिलेगी. report-uri
या report-to
डायरेक्टिव का इस्तेमाल करके, रिपोर्टिंग डेस्टिनेशन सेट की जा सकती है. फ़िलहाल, report-to
सभी मॉडर्न ब्राउज़र पर काम नहीं करता. इसलिए, हमारा सुझाव है कि आप दोनों या सिर्फ़ report-uri
ब्राउज़र का इस्तेमाल करें.
अगर कोई कॉन्टेंट सीएसपी का उल्लंघन करता है, तो ब्राउज़र, कॉन्फ़िगर किए गए डेस्टिनेशन पर रिपोर्ट भेजेगा. पक्का करें कि आपने इस डेस्टिनेशन पर इन रिपोर्ट को हैंडल करने वाला ऐप्लिकेशन कॉन्फ़िगर किया हो.
एचटीटीपी हेडर में सीएसपी तय करें
सीएसपी को मेटा टैग में इस तरह से परिभाषित किया जा सकता है:
<meta http-equiv="Content-Security-Policy" content="script-src 'none'">
हालांकि, अगर आप कर सकें, तो आपको एचटीटीपी रिस्पॉन्स हेडर में सीएसपी तय करना चाहिए. मेटा टैग से पहले एक इंजेक्शन, सीएसपी को बायपास कर देगा. इसके अलावा, frame-ancestors
, sandbox
, और मेटा टैग सीएसपी में रिपोर्टिंग की सुविधा काम नहीं करती.
पक्का करें कि सीएसपी, पुराने सिस्टम के साथ काम करता है
सभी ब्राउज़र में सीएसपी नॉन्स/हैश के साथ काम नहीं करता. इसलिए, नीति का पालन न करने वाले ब्राउज़र के लिए, unsafe-inline
को फ़ॉलबैक के तौर पर जोड़ने का सुझाव दिया जाता है. अगर ब्राउज़र, नॉन्स/हैश के साथ काम करता है, तो unsafe-inline
को अनदेखा कर दिया जाएगा.
इसी तरह, strict-dynamic
सभी ब्राउज़र पर काम नहीं करता. हमारा सुझाव है कि नीति का पालन न करने वाले ब्राउज़र के लिए, अनुमति वाले डोमेन की सूची को फ़ॉलबैक के तौर पर सेट करें. strict-dynamic
पर काम करने वाले ब्राउज़र पर, अनुमति वाली सूची को अनदेखा कर दिया जाएगा.
सख्त सीएसपी डेवलप करने का तरीका
नीचे नॉन्स-आधारित नीति के साथ सख्त सीएसपी का इस्तेमाल करने का उदाहरण दिया गया है.
सीएसपी:
script-src 'nonce-random123' 'strict-dynamic' 'unsafe-inline' https:;
object-src 'none';
base-uri 'none';
report-uri https://reporting.example.com;
HTML:
<script nonce="random123" src="https://trusted.example.com/trusted_script.js"></script>
हर बार पेज लोड होने पर random123
, base64 स्ट्रिंग जनरेट की गई कोई भी सर्वर साइड होगी. नॉन्स और strict-dynamic
की वजह से आधुनिक ब्राउज़र में unsafe-inline
और https:
को अनदेखा कर दिया जाता है. सख्त सीएसपी इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, स्ट्रिक्ट सीएसपी गाइड देखें.
लाइटहाउस और सीएसपी इवैलुएटर का इस्तेमाल करके, संभावित बायपास का पता लगाया जा सकता है. अगर आपको मौजूदा पेज को नुकसान पहुंचाए बिना नए सीएसपी की जांच करनी है, तो सिर्फ़-रिपोर्ट मोड में सीएसपी की जानकारी दें. इसके लिए, हेडर के नाम के तौर पर Content-Security-Policy-Report-Only
का इस्तेमाल करें. इससे report-to
और report-uri
के साथ कॉन्फ़िगर किए गए सभी रिपोर्टिंग डेस्टिनेशन पर सीएसपी के उल्लंघन जुड़ेंगे, लेकिन असल में सीएसपी लागू नहीं होगा.