स्क्रिप्ट और शैली तत्वों के लिए HTML "गैर" विशेषता का उद्देश्य क्या है?


140

W3C का कहना है कि HTML5.1 में एक नई विशेषता है जिसे कहा जाता nonceहै styleऔर scriptइसका उपयोग किसी वेबसाइट की सामग्री सुरक्षा नीति द्वारा किया जा सकता है।

मैंने इसके बारे में गुगली की, लेकिन अंत में यह नहीं पाया कि यह विशेषता वास्तव में क्या करती है और इसका उपयोग करते समय क्या परिवर्तन होता है?


2
ऐसा लगता है कि यह आपकी साइट के लिए सुरक्षा का एक अतिरिक्त बिट है, आप इसे एक लिंक या एक फॉर्म में जोड़ते हैं और जब पृष्ठ परोसा जाता है, यदि गैर आपके से मेल नहीं खाता है, तो आप पृष्ठ की सेवा नहीं करते हैं
पीट

@Pete का मतलब है कि कोई भी आपके scriptऔर लोड नहीं कर सकता है style? हॉटलिंक प्रतिबंध जैसा कुछ?
अता

यह सामान्य पृष्ठों और फॉर्म सत्यापन के लिए भी है
पीट

जवाबों:


195

nonceविशेषता को "श्वेत सूची" कुछ इनलाइन लिए सक्षम बनाता है scriptऔर styleजबकि सीएसपी का उपयोग न करें, तत्व unsafe-inline(जो की अनुमति होगी निर्देश सभी इनलाइन script/ style,) ताकि आप अभी भी इनलाइन अनुमति न देने की कुंजी सीएसपी सुविधा को बनाए रखने script/ styleसामान्य रूप में।

इसलिए nonceविशेषता ब्राउज़रों को यह बताने का तरीका है कि किसी विशेष स्क्रिप्ट या शैली तत्व की इनलाइन सामग्री को कुछ (दुर्भावनापूर्ण) तृतीय पक्ष द्वारा दस्तावेज़ में अंतःक्षिप्त नहीं किया गया था, लेकिन इसके बजाय जानबूझकर दस्तावेज़ में डाल दिया गया था जो कोई भी उस दस्तावेज़ को नियंत्रित करता है जिसे दस्तावेज़ सेवा प्रदान करता है से।

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it इस nonceविशेषता का उपयोग करने का एक अच्छा उदाहरण देता है , जिसमें निम्न चरणों का पालन होता है:

  1. आपके अनुरोध के लिए आपका वेब सर्वर किसी विशेष दस्तावेज़ के लिए प्राप्त करता है, तो अपने बैकएंड को क्रिप्टोग्राफिक रूप से सुरक्षित रैंडम नंबर जनरेटर से कम से कम 128 बिट डेटा का एक यादृच्छिक बेस 64-एन्कोडेड स्ट्रिंग उत्पन्न करें; जैसे, EDNnf03nceIOfn39fn3e9h3sdfa। वह तुम्हारा गैर है।

  2. चरण 1 में उत्पन्न गैर-ले लो, और किसी भी इनलाइन के लिए script/ styleआप "श्वेतसूची" करना चाहते हैं, अपने बैकएंड कोड nonceको दस्तावेज़ में एक विशेषता डालें , इससे पहले कि तार पर भेजा जाए, मान के रूप में उस गैर के साथ:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. चरण 1 में उत्पन्न अस्थायी रूप से, आगे जोड़ते ले लो nonce-इसे करने के लिए, और अपने बैकएंड के लिए स्रोत सूची के मूल्यों के बीच उस के साथ एक सीएसपी हैडर उत्पन्न करना script-srcया style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

तो एक गैर का उपयोग करने का तंत्र आपके बैकएंड को इनलाइन की सामग्री का एक हैश उत्पन्न करने के बजाय एक विकल्प है scriptया styleआप अनुमति देना चाहते हैं, और फिर उस हैश को अपने सीएसपी हेडर में उपयुक्त स्रोत सूची में निर्दिष्ट करें।

ध्यान दें कि क्योंकि ब्राउजर ऐसा नहीं करते (चेक कर सकते हैं) कि नॉन वैल्यू ने पेज रिक्वेस्ट के बीच बदलाव भेजा है, यह संभव है — हालाँकि पूरी तरह से अनजाने में — 1 से ऊपर छोड़ने के लिए और न ही आपके बैकेंड ने नॉन के लिए गतिशील रूप से कुछ भी किया हो, जिस स्थिति में आप बस nonceअपने doc के HTML स्रोत में एक स्थिर मूल्य के साथ एक विशेषता डाल सकता है , और उसी गैर मूल्य के साथ एक स्थिर CSP शीर्ष लेख भेजें।

लेकिन इसका कारण यह है कि आप इस तरह से एक स्टैटिक नॉनस का उपयोग नहीं करना चाहते हैं, यह बहुत ज्यादा है कि नॉन का उपयोग करने के पूरे उद्देश्य को हराना शुरू कर दें - क्योंकि, अगर आप स्टैटिक नॉनस का उपयोग करना चाहते हैं, तो उस बिंदु पर आप बस का उपयोग कर सकते हैं unsafe-inline


17
यह उपयोगकर्ता को सत्यापित करने के लिए नहीं है - यह सत्यापित करने के लिए है कि किसी विशेष स्क्रिप्ट या शैली तत्व की इनलाइन सामग्री को दस्तावेज़ में मेरे कुछ (दुर्भावनापूर्ण) तीसरे पक्ष में इंजेक्ट नहीं किया गया था, लेकिन इसके बजाय दस्तावेज़ में जानबूझकर डाल दिया गया था जो भी सर्वर को नियंत्रित करता है से परोसा जाता है। (मैं कहने के लिए अपना जवाब अपडेट करूंगा।)
साइडशोबर्कर

3
नॉन को संग्रहीत करने की आवश्यकता नहीं है - इसके बजाय वे मेमोरी में उत्पन्न होते हैं और सीएसपी हेडर और HTML दस्तावेज़ में डाला जाता है जो प्रतिक्रियाओं के तार पर भेजा जाता है (सर्वर फाइल सिस्टम / डेटाबेस पर संग्रहीत स्रोत पर नहीं)।
साइडशोबर्कर

3
जहां तक nonceविशेषता के उपयोग में प्रयास करने का कोई कारण है , अगर आपको इसका उपयोग करने की बिल्कुल आवश्यकता नहीं है, तो न करें। यह वास्तव में केवल उन मामलों के लिए होता है जहां किसी कारण से आप (अभी तक) किसी विशेष दस्तावेज़ से कुछ इनलाइन स्क्रिप्ट या शैली सामग्री से छुटकारा नहीं पा सकते हैं (लेकिन बाद में इसे हटा दिया जाना चाहिए)। तो अगर किसी कारण से आप इनलाइन स्क्रिप्ट और स्टाइल सामग्री को रखने की आवश्यकता के साथ फंस गए हैं, तो इस बीच में आप कम से कम गैर-तंत्र का उपयोग कर सकते हैं ताकि वे ब्राउज़रों को सत्यापित कर सकें कि वे ठीक हैं। अन्यथा आपको पूरी तरह से सीएसपी का पूरी तरह से उपयोग करना चाहिए, जैसा कि किसी भी इनलाइन स्क्रिप्ट या शैली के तत्वों की अनुमति नहीं है
साइडशोर्कर

2
@ सिद्देश्वोर्कर, एक खाली व्यक्ति क्या करता है? मैं पेजों को देख रहा हूं <script type="text/javascript" nonce>और<style type="text/css" nonce>
पचेरियर

7
नोट: यदि आपकी स्क्रिप्ट स्थिर है, तो मैं एक गैर के बजाय एक CSP हैश की सलाह देता हूं।
ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.