सामग्री सुरक्षा नीति कैसे काम करती है?


248

मुझे डेवलपर कंसोल में त्रुटियों का एक गुच्छा मिल रहा है:

एक स्ट्रिंग का मूल्यांकन करने से इनकार कर दिया

इनलाइन स्क्रिप्ट निष्पादित करने से इनकार कर दिया क्योंकि यह निम्नलिखित सामग्री सुरक्षा नीति के निर्देशों का उल्लंघन करता है

स्क्रिप्ट लोड करने से इनकार कर दिया

स्टाइलशीट लोड करने से इनकार कर दिया

यहाँ सब किसके लिए है? सामग्री सुरक्षा नीति कैसे काम करती है? मैं Content-Security-PolicyHTTP शीर्ष लेख का उपयोग कैसे करूँ ?

विशेष रूप से, कैसे ...

  1. ... कई स्रोतों की अनुमति दें?
  2. ... विभिन्न निर्देशों का उपयोग करें?
  3. ... कई निर्देशों का उपयोग करें?
  4. ... बंदरगाहों को संभाल?
  5. ... विभिन्न प्रोटोकॉल संभाल?
  6. ... file://प्रोटोकॉल की अनुमति दें ?
  7. ... इनलाइन शैलियों, लिपियों और टैग का उपयोग करें <style>और <script>?
  8. ... अनुमति दें eval()?

और अंत में:

  1. वास्तव में क्या 'self'मतलब है?

जवाबों:


557

Content-Security-Policyमेटा टैग आप के जोखिम को कम करने की अनुमति देता XSS जहां संसाधनों से लोड किया जा सकता, किसी भी अन्य स्थानों से डेटा लोड होने से ब्राउज़र को रोकने आप को परिभाषित करने की अनुमति देकर हमला करता है। इससे हमलावर के लिए आपकी साइट में दुर्भावनापूर्ण कोड इंजेक्ट करना कठिन हो जाता है।

मैंने एक ईंट की दीवार के खिलाफ अपना सिर पीटा, यह जानने की कोशिश कर रहा था कि मुझे एक के बाद एक सीएसपी त्रुटियां क्यों हो रही थीं, और यह कोई संक्षिप्त, स्पष्ट निर्देश नहीं था कि यह कैसे काम करता है। इसलिए यहाँ सीएसपी के कुछ बिंदुओं को संक्षेप में समझाने का मेरा प्रयास है , ज्यादातर उन चीज़ों पर ध्यान केंद्रित करना जिन्हें मैंने हल करना मुश्किल पाया।

संक्षिप्तता के लिए मैं प्रत्येक नमूने में पूर्ण टैग नहीं लिखूंगा। इसके बजाय मैं केवल contentसंपत्ति दिखाऊंगा , इसलिए एक नमूना जो कहता content="default-src 'self'"है कि इसका मतलब है:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

1. कई स्रोतों की अनुमति कैसे दें?

आप अंतरिक्ष अलग सूची के रूप में एक निर्देश के बाद बस अपने स्रोतों को सूचीबद्ध कर सकते हैं:

content="default-src 'self' https://example.com/js/"

ध्यान दें कि विशेष के अलावा मापदंडों के आसपास कोई उद्धरण नहीं है, जैसे 'self'। साथ ही, :निर्देश के बाद कोई कॉलन ( ) नहीं है । बस निर्देश, फिर मापदंडों की एक अलग-अलग सूची।

निर्दिष्ट मापदंडों के नीचे सब कुछ निहित है। इसका मतलब है कि इन उदाहरणों के ऊपर मान्य स्रोत होंगे:

https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js

हालांकि, ये मान्य नहीं होंगे:

http://example.com/js/file.js
^^^^ wrong protocol

https://example.com/file.js
                   ^^ above the specified path

2. विभिन्न निर्देशों का उपयोग कैसे करें, वे प्रत्येक क्या करते हैं?

सबसे आम निर्देश हैं:

  • default-src जावास्क्रिप्ट, छवियों, सीएसएस, फोंट, AJAX अनुरोधों आदि को लोड करने के लिए डिफ़ॉल्ट नीति
  • script-src जावास्क्रिप्ट फ़ाइलों के लिए वैध स्रोतों को परिभाषित करता है
  • style-src सीएसएस फ़ाइलों के लिए वैध स्रोतों को परिभाषित करता है
  • img-src छवियों के लिए वैध स्रोतों को परिभाषित करता है
  • connect-srcXMLHttpRequest (AJAX), WebSockets या EventSource के लिए मान्य लक्ष्यों को परिभाषित करता है। यदि एक कनेक्शन का प्रयास उस होस्ट को किया जाता है जिसे यहां अनुमति नहीं है, तो ब्राउज़र एक 400त्रुटि का अनुकरण करेगा

अन्य हैं, लेकिन ये वे हैं जिनकी आपको सबसे अधिक संभावना है।

3. कई निर्देशों का उपयोग कैसे करें?

आप अपने सभी निर्देशों को एक मेटा-टैग के अंदर एक अर्धविराम ( ;) के साथ समाप्त करके परिभाषित करते हैं :

content="default-src 'self' https://example.com/js/; style-src 'self'"

4. बंदरगाहों को कैसे संभालें?

अनुमत डोमेन के बाद पोर्ट नंबर या तारांकन जोड़कर सब कुछ लेकिन डिफ़ॉल्ट बंदरगाहों को स्पष्ट रूप से अनुमति देने की आवश्यकता है:

content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"

उपरोक्त परिणाम होगा:

https://ajax.googleapis.com:123
                           ^^^^ Not ok, wrong port

https://ajax.googleapis.com - OK

http://example.com/free/stuff/file.js
                 ^^ Not ok, only the port 123 is allowed

http://example.com:123/free/stuff/file.js - OK

जैसा कि मैंने उल्लेख किया है, आप सभी बंदरगाहों को स्पष्ट रूप से अनुमति देने के लिए एक तारांकन चिह्न का उपयोग कर सकते हैं:

content="default-src example.com:*"

5. विभिन्न प्रोटोकॉल को कैसे संभालना है?

डिफ़ॉल्ट रूप से, केवल मानक प्रोटोकॉल की अनुमति है। उदाहरण के लिए WebSockets की अनुमति देने के लिए ws://आपको इसे स्पष्ट रूप से अनुमति देना होगा:

content="default-src 'self'; connect-src ws:; style-src 'self'"
                                         ^^^ web sockets are now allowed on all domains and ports

6. फाइल प्रोटोकॉल की अनुमति कैसे दें file://?

यदि आप इसे परिभाषित करने की कोशिश करेंगे जैसे कि यह काम नहीं करेगा। इसके बजाय, आप इसे filesystemपैरामीटर के साथ अनुमति देंगे :

content="default-src filesystem"

7. इनलाइन स्क्रिप्ट और स्टाइल परिभाषा का उपयोग कैसे करें?

जब तक स्पष्ट रूप से अनुमति नहीं दी जाती है, आप इनलाइन शैली परिभाषाओं का उपयोग नहीं कर सकते, कोड <script>टैग के अंदर या जैसे टैग गुणों में onclick। आप उन्हें ऐसा करने की अनुमति देते हैं:

content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"

आपको इनलाइन, बेस 64 एनकोडेड छवियों को स्पष्ट रूप से अनुमति देना होगा:

content="img-src data:"

8. कैसे अनुमति दें eval()?

मुझे यकीन है कि बहुत से लोग कहेंगे कि आप नहीं करते हैं, क्योंकि 'बुराई बुराई है' और दुनिया के आसन्न अंत का सबसे संभावित कारण है। वे लोग गलत होंगे। निश्चित रूप से, आप अपनी साइट की सुरक्षा में बड़े छेद को निश्चित रूप से निकाल सकते हैं, लेकिन इसमें पूरी तरह से वैध उपयोग के मामले हैं। बस आपको इसे इस्तेमाल करने में होशियार रहना होगा। आप इसे ऐसा करने की अनुमति देते हैं:

content="script-src 'unsafe-eval'"

9. वास्तव में क्या 'self'मतलब है?

आप 'self'स्थानीय होस्ट, स्थानीय फाइल सिस्टम या समान होस्ट पर कुछ भी ले सकते हैं । इसका कोई मतलब नहीं है। इसका मतलब उन स्रोतों से है जिनके पास समान योजना (प्रोटोकॉल), समान होस्ट और फ़ाइल नीति में परिभाषित की गई फ़ाइल के समान पोर्ट है, आपकी साइट को HTTP पर सेवा दे रहा है? तब तक आपके लिए कोई https नहीं, जब तक आप इसे स्पष्ट रूप से परिभाषित नहीं करते हैं।

मैंने 'self'ज्यादातर उदाहरणों में उपयोग किया है क्योंकि यह आमतौर पर इसे शामिल करने के लिए समझ में आता है, लेकिन यह अनिवार्य नहीं है। यदि आपको इसकी आवश्यकता नहीं है, तो इसे छोड़ दें।

लेकिन एक मिनट रुको! क्या मैं इसका उपयोग नहीं कर सकता content="default-src *"और इसके साथ किया जा सकता है?

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

content="default-src * 'unsafe-inline' 'unsafe-eval'"

... लेकिन मुझे विश्वास है कि आप नहीं करेंगे।

आगे की पढाई:

http://content-security-policy.com

http://en.wikipedia.org/wiki/Content_Security_Policy


6
महान पद। एक बात: यह स्पष्ट नहीं है कि कई निर्देश निर्दिष्ट होने पर क्या होता है; उदाहरण 3 में स्टाइल-src सेटिंग्स डिफ़ॉल्ट-src पर पूर्वता लेते हैं? आदि ...
ट्रैक 0

30
इसलिए, हर चीज को हर चीज की अनुमति देने के लिएdefault-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
अर्नोल्ड रोआ

8
यह जानना महत्वपूर्ण है कि content="default-src * 'unsafe-inline' 'unsafe-eval'"कुछ कोणीय अनुप्रयोगों को काम करने के लिए आवश्यक है।
flanger001

2
@ महेश वह "ब्लॉग" एसओ से कॉपी किए गए पोस्ट से भरा है। लगता है कि इतने सारे SO उपयोगकर्ता किसी अज्ञात ब्लॉगर की सामग्री की नकल नहीं करेंगे - मुझे पता है कि मैंने नहीं किया।
Schlaus

2
connect-srcयदि आप संपूर्ण उपपथ को शामिल करना चाहते हैं, तो संक्षिप्त नोट और पथ: ट्रेलिंग स्लैश अनिवार्य हैं। उदा: http://foo.com/files/bar.txtयदि स्रोत है तो फ़ाइल ब्लॉक कर दी जाएगी http://foo.com/files, लेकिन जब यह उपलब्ध हो जाएगाhttp://foo.com/files/
Griddo

15

APACHE2 MOD_HEADERS

आप Apache2 mod_headers को भी सक्षम कर सकते हैं, फेडोरा पर यह पहले से ही डिफ़ॉल्ट रूप से सक्षम है, अगर आप उबंटू / डेबियन का उपयोग इस तरह सक्षम करते हैं:

# First enable headers module for Apache2, 
# then restart the Apache2 service   
a2enmod headers
apache2 -k graceful

उबंटू / डेबियन पर आप फ़ाइल में हेडर कॉन्फ़िगर कर सकते हैं /etc/apache2/conf-enabled/security.conf

#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
# 
#Header set X-Content-Type-Options: "nosniff"

#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
Header always set X-Frame-Options: "sameorigin"
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Permitted-Cross-Domain-Policies "master-only"
Header always set Cache-Control "no-cache, no-store, must-revalidate"
Header always set Pragma "no-cache"
Header always set Expires "-1"
Header always set Content-Security-Policy: "default-src 'none';"
Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;"
Header always set Content-Security-Policy: "style-src 'self' www.example.com;"

नोट: यह फ़ाइल का निचला भाग है, केवल अंतिम 3 प्रविष्टियाँ CSP सेटिंग्स हैं।

पहला पैरामीटर निर्देश है, 2 श्वेत-सूचीबद्ध होने के स्रोत हैं। मैंने Google विश्लेषिकी और एक विज्ञापनदाता जोड़ा है, जो आपके पास हो सकता है। इसके अलावा मैंने पाया कि अगर आपके पास उपनाम है, जैसे, www.example.com और example.com कॉन्फ़िगर Apache2 में तो आपको उन्हें सफेद सूची में भी जोड़ना चाहिए।

इनलाइन कोड हानिकारक माना जाता है, आपको इससे बचना चाहिए। सभी javascripts और css को अलग-अलग फाइलों में कॉपी करें और उन्हें व्हाइट-लिस्ट में जोड़ें।

जब आप इस पर होते हैं तो आप अन्य हेडर सेटिंग्स पर एक नज़र डाल सकते हैं और mod_security स्थापित कर सकते हैं

आगे की पढाई:

https://developers.google.com/web/fundamentals/security/csp/

https://www.w3.org/TR/CSP/


2
मैं अपने .htaccess फ़ाइल में उन्हीं निर्देशों को जोड़ने में सक्षम था, क्योंकि मेरे पास मेरे साझा होस्ट पर अपाचे कॉन्फ़िगरेशन को संपादित करने की क्षमता नहीं है। मुझे रिपोर्ट-uri.io/home/tools पर इन सेटिंग्स को समायोजित करने के लिए उत्कृष्ट उपकरण मिले
माइकल मैकगिनिस

क्या इसे टमकाट 7 के साथ हल करने का कोई तरीका है। मैंने फिल्टर जोड़ने की कोशिश की है और काम नहीं किया है।
एलशान

0

फ़ॉन्ट-src के बारे में मत भूलना यह किसी भी अन्य के समान काम करता है, लेकिन यदि आप अन्य मूल से लोड किए गए फ़ॉन्ट का उपयोग करते हैं - सुनिश्चित करें कि आप इसे मेटा टैग में जोड़ते हैं

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