पब्लिश होने की तारीख: 17 नवंबर, 2025
Chrome 141 से, ऑरिजिन ट्रायल में शामिल हुआ जा सकता है. इससे, Chrome की नई कॉन्टेंट सिक्योरिटी पॉलिसी (सीएसपी) की सुविधाओं को आज़माया जा सकता है. इन सुविधाओं की मदद से वेबसाइटें, XSS से खुद को सुरक्षित रख सकती हैं. इसके लिए, वे JavaScript के जाने-पहचाने सोर्स को बेहतर तरीके से अनुमति देती हैं. भरोसेमंद JavaScript को अनुमति देना और अन्य सभी सोर्स को ब्लॉक करना, XSS को रोकने का असरदार तरीका है. हमलावर ने JavaScript को इंजेक्ट किया है. इसे अनुमति वाली सूची में शामिल नहीं किया जाएगा. इसलिए, इसे ब्लॉक कर दिया जाएगा.
इन सुविधाओं के बिना, "सख्त" सीएसपी का इस्तेमाल करना मुश्किल होता है. यह सीएसपी, स्क्रिप्ट होस्ट और साइट के बीच नॉनस कम्यूनिकेशन मैकेनिज़्म के बिना या स्क्रिप्ट के पूरे हैश को पहले से जाने बिना, सभी JavaScript सोर्स को अनुमति देता है. अगर स्क्रिप्ट में बार-बार बदलाव होता है और उसे किसी भरोसेमंद, लेकिन अलग तीसरे पक्ष की कंपनी होस्ट करती है, तो इन दोनों तरीकों को लागू करना मुश्किल होता है. इसके अलावा, अगर किसी स्क्रिप्ट को eval का इस्तेमाल करना है, तो फ़िलहाल सीएसपी के लिए यह ज़रूरी है कि आप सभी स्क्रिप्ट के लिए eval को अनुमति वाली सूची में शामिल करें. इससे सीएसपी काफ़ी कमज़ोर हो जाता है.
हम इस समस्या को हल करने की कोशिश कर रहे हैं. इसके लिए, हम script-src में यूआरएल के आधार पर स्क्रिप्ट को अनुमति देने के लिए, बेहतर तरीका उपलब्ध करा रहे हैं. साथ ही, eval को कॉल करने की अनुमति देने के लिए भी एक तरीका उपलब्ध करा रहे हैं. script-src में मौजूद हैश करने की सुविधा का इस्तेमाल करके, कुछ स्क्रिप्ट के यूआरएल और eval (और eval जैसी अन्य सुविधाएं) को पास किए गए JavaScript को अनुमति दी जा सकेगी. यूआरएल के आधार पर अनुमति देने की सुविधा, इंटिग्रिटी के आधार पर काम करने वाले सीएसपी की तरह सख्त नहीं है. हालांकि, यह सुविधा होस्टनेम के आधार पर अनुमति देने की मौजूदा सुविधा से बेहतर है.
हमारा मानना है कि इससे सीएसपी की ऐसी नीति को लागू करना आसान हो जाता है जो अब भी XSS को काफ़ी हद तक कम करती है. ऐसा इसलिए, क्योंकि यह नीति, अनुमति न दी गई इनलाइन और इवैल स्क्रिप्ट को ब्लॉक करती है. इन नई सुविधाओं को सावधानीपूर्वक डिज़ाइन और लागू किया गया है, ताकि साइटें ऐसी नीति सेट कर सकें जो नई सुविधा के साथ काम करने वाले ब्राउज़र में बेहतर सुरक्षा दे. साथ ही, इससे उन ब्राउज़र में सुरक्षा से जुड़ी समस्याएं न आएं जिनमें यह सुविधा काम नहीं करती. इसके लिए, उपयोगकर्ता-एजेंट स्निफ़िंग की ज़रूरत नहीं होती.
उपयोग के उदाहरण
script-src एट्रिब्यूट के साथ इस्तेमाल करने के लिए, कुछ यूआरएल को अनुमति वाली सूची में जोड़ना
जिन साइटों को script-src के साथ इस्तेमाल करने के लिए, कुछ स्क्रिप्ट को अनुमति देनी है उनके पास फ़िलहाल दो विकल्प हैं: सबसंसाधन इंटिग्रिटी (एसआरआई) के ज़रिए स्क्रिप्ट के कॉन्टेंट को अनुमति दें या होस्टनेम को अनुमति देने के लिए host-source का इस्तेमाल करें. एसआरआई, अक्सर उन स्क्रिप्ट के लिए सही नहीं होती जिनमें अक्सर बदलाव होता है. उदाहरण के लिए, आंकड़ों से जुड़ी स्क्रिप्ट. strict-dynamic सेट होने पर, host-source को अनदेखा कर दिया जाएगा. साथ ही, यह पूरी तरह से सुरक्षा नहीं करता, क्योंकि इसमें यूआरएल पैरामीटर शामिल नहीं होते. इस बदलाव के बाद, स्क्रिप्ट को अनुमति वाली सूची में शामिल किया जा सकेगा. इसके लिए, स्क्रिप्ट के (पूरे) यूआरएल के हैश का इस्तेमाल किया जाएगा. साथ ही, डाइनैमिक स्क्रिप्ट और strict-dynamic का इस्तेमाल करने वाले कॉन्फ़िगरेशन, दोनों के लिए यह सुविधा उपलब्ध होगी.
eval या eval जैसे फ़ंक्शन के साथ इस्तेमाल करने के लिए, कुछ स्क्रिप्ट को अनुमति दें
कुछ साइटों को eval या eval जैसे फ़ंक्शन इस्तेमाल करने की ज़रूरत होती है. जैसे, setTimeout, setInterval, और setImmediate में कोड को स्ट्रिंग लिटरल के तौर पर पास करना. इन साइटों के लिए, सीएसपी का सिर्फ़ एक विकल्प उपलब्ध है: unsafe-eval. यह eval को सभी कॉल चालू करता है. हम eval के लिए, कुछ इनपुट को अनुमति देने का तरीका जोड़ रहे हैं. इस नई सुविधा की मदद से, सीधे तौर पर स्क्रिप्ट के कॉन्टेंट को हैश करके, सिर्फ़ उन स्क्रिप्ट को अनुमति दी जा सकती है जिनकी ज़रूरत है. इसके लिए, असुरक्षित-ईवैल सीएसपी का इस्तेमाल करने की ज़रूरत नहीं होती.
अपनी प्रोफ़ाइल बनाना शुरू करें
स्क्रिप्ट और eval हैशिंग की सुविधा आज़माने के लिए,
सीएसएपी script-src के ऑरिजिन ट्रायल में यूआरएल और eval हैश में शामिल हों. यह ऑरिजिन ट्रायल, Chrome 141 से 144 तक चलेगा.
script-src में हैश जोड़ें
यूआरएल को अनुमति वाली सूची में शामिल करने के लिए, script-src CSP डायरेक्टिव में url-<hash-algorithm>-<script-url-hash> के तौर पर वैल्यू जोड़ी जाती है. इससे उस यूआरएल पर मौजूद किसी भी कॉन्टेंट को चलाने की अनुमति मिल जाएगी. भले ही, वह कॉन्टेंट कुछ भी हो. हैश में सिर्फ़ शुरुआती यूआरएल (पेज पर शामिल यूआरएल) होना चाहिए. इसमें वह यूआरएल शामिल नहीं होना चाहिए जिस पर यह यूआरएल रीडायरेक्ट करता है. इसमें पूरे और मिलते-जुलते यूआरएल, दोनों का इस्तेमाल किया जा सकता है.
उदाहरण के लिए, यहां दिया गया CSP हेडर, https://example.com/example.js पर मौजूद स्क्रिप्ट को अनुमति देगा:
Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';
यहां 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=', 'https://example.com/example.js' का sha256 हैश है.
eval या new Function के ज़रिए जिन स्क्रिप्ट का आकलन किया जाता है उन्हें अनुमति वाली सूची में शामिल किया जा सकता है. इसके लिए, स्क्रिप्ट src में eval-<hash-algorithm>-<script-contents-hash> को शामिल करें. उदाहरण के लिए, यह सीएसपी हेडर, alert("hello world") को eval() स्ट्रिंग पास करने की अनुमति देगा:
Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';
यहां 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=', alert("hello world") का sha256 हैश है.
शुरुआती तौर पर इसे अपनाने में मदद करने के लिए, जब कोई साइट ऑरिजिन ट्रायल में ऑप्ट इन करती है, तो यूआरएल और eval, दोनों के हैश DevTools कंसोल में प्रिंट किए जाएंगे. साथ ही, इन्हें सीएसपी रिपोर्ट में शामिल किया जाएगा. इसका मतलब है कि अनुमति वाली सूची में शामिल करने के लिए ज़रूरी सभी हैश की गिनती करने के लिए, report-only नीति का इस्तेमाल किया जा सकता है. हालांकि, यह नीति सख्त है.
पुराने सिस्टम के साथ काम करने की सुविधा बनाए रखना
सभी ब्राउज़र में सहायता जोड़ने से पहले इन नीतियों को डिप्लॉय करने की अनुमति देने के लिए, होस्ट के आधार पर अनुमति वाली सूचियों के बाद यूआरएल हैश की सूची बनाई जा सकती है. नए हैश टाइप को समझने वाले ब्राउज़र, होस्ट के आधार पर बनाई गई पिछली अनुमति वाली सूचियों को अनदेखा करेंगे. वहीं, नए हैश टाइप को न समझने वाले ब्राउज़र, होस्ट के आधार पर बनाई गई अनुमति वाली सूची को लागू करेंगे. इससे साइटें, दोनों को सेट कर सकती हैं. साथ ही, नए हैश टाइप को समझने वाले ब्राउज़र में ज़्यादा पाबंदियों वाली नीति का इस्तेमाल कर सकती हैं. इससे, नए हैश टाइप को न समझने वाले ब्राउज़र में साइट के काम न करने का जोखिम नहीं होगा. इसे यहां दिए गए उदाहरण में दिखाया गया है.
Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
हमने strict-dynamic-url भी लॉन्च किया है. यह strict-dynamic के जैसा ही है. हालांकि, यह सिर्फ़ तब लागू होता है, जब यूआरएल हैश सेट किए जाते हैं. स्ट्रिक्ट-डाइनैमिक की वजह से, होस्ट के आधार पर बनाई गई अनुमति वाली सूचियों को अनदेखा कर दिया जाता है. इसलिए, अगर किसी साइट को किसी खास हैश को अनुमति वाली सूची में शामिल करना है और उस पर स्ट्रिक्ट-डाइनैमिक लागू करना है, तो वह इस तरह की नीति का इस्तेमाल कर सकती है:
Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
इस उदाहरण में, जिन ब्राउज़र पर हैश की सुविधा काम नहीं करती वे सिर्फ़ https: लागू करेंगे. इसी तरह, eval हैश मौजूद होने पर, unsafe-eval को भी काम करने वाले ब्राउज़र अनदेखा कर देंगे. उदाहरण के लिए, इस नीति का आकलन unsafe-eval के तौर पर किया जाएगा. इससे उन ब्राउज़र पर eval() का इस्तेमाल किया जा सकता है जो अब तक eval हैश के साथ काम नहीं करते. वहीं, eval हैश के साथ काम करने वाले ब्राउज़र पर सिर्फ़ alert("hello world") के eval() का इस्तेमाल किया जा सकता है.
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
सुझाव, शिकायत या राय दें
हमें script-src के इन एक्सटेंशन के बारे में डेवलपर के सुझाव/राय/शिकायत का इंतज़ार है. github में मौजूद जानकारी देने वाले लेख में, किसी भी टिप्पणी को समस्या के तौर पर पोस्ट करें.