সামগ্রী সুরক্ষা নীতি কীভাবে কাজ করে?


248

বিকাশকারী কনসোলে আমি বেশ কিছু ত্রুটি পেয়ে যাচ্ছি:

একটি স্ট্রিং মূল্যায়ন প্রত্যাখ্যান

ইনলাইন স্ক্রিপ্ট কার্যকর করতে অস্বীকৃতি জানায় কারণ এটি নিম্নলিখিত সামগ্রী সুরক্ষা নীতি নির্দেশকে লঙ্ঘন করে

স্ক্রিপ্ট লোড করতে অস্বীকার

স্টাইলশীট লোড করতে অস্বীকার

এসব কিসের? সামগ্রী সুরক্ষা নীতি কীভাবে কাজ করে? আমি কীভাবে Content-Security-Policyএইচটিটিপি হেডার ব্যবহার করব ?

বিশেষত, কীভাবে ...

  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

২. বিভিন্ন নির্দেশিকা কীভাবে ব্যবহার করবেন, তারা প্রত্যেকে কী করে?

সর্বাধিক সাধারণ নির্দেশাবলী হ'ল:

  • default-src জাভাস্ক্রিপ্ট, চিত্র, সিএসএস, ফন্ট, এজেএক্স অনুরোধ ইত্যাদি লোড করার জন্য ডিফল্ট নীতি
  • script-src জাভাস্ক্রিপ্ট ফাইলের জন্য বৈধ উত্স সংজ্ঞা দেয়
  • style-src সিএসএস ফাইলের জন্য বৈধ উত্স সংজ্ঞা দেয়
  • img-src চিত্রগুলির জন্য বৈধ উত্সগুলি সংজ্ঞায়িত করে
  • connect-srcএক্সএমএলএইচটিপিআরকুয়েস্ট (এজেএক্স), ওয়েবসকেটস বা ইভেন্টসোর্সকে বৈধ লক্ষ্যগুলি নির্ধারণ করে। যদি কোনও হোস্টের সাথে সংযোগের চেষ্টা করা হয় যা এখানে অনুমোদিত নয় তবে ব্রাউজারটি একটি 400ত্রুটি অনুকরণ করবে

অন্যদের মধ্যে রয়েছে, তবে এগুলি হ'ল আপনার সবচেয়ে বেশি প্রয়োজন।

৩. একাধিক নির্দেশিকা কীভাবে ব্যবহার করবেন?

আপনি আপনার সমস্ত নির্দেশকে একটি মেটা-ট্যাগের ভিতরে একটি সেমিকোলন ( ;) দিয়ে সমাপ্ত করে সংজ্ঞায়িত করেন :

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

৪. বন্দরগুলি কীভাবে পরিচালনা করবেন?

ডিফল্ট বন্দরগুলি ছাড়াও সমস্ত কিছুই অনুমোদিত ডোমেনের পরে পোর্ট নম্বর বা একটি নক্ষত্র যুক্ত করে স্পষ্টভাবে অনুমতি দেওয়া দরকার:

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:*"

৫. বিভিন্ন প্রোটোকল কীভাবে পরিচালনা করবেন?

ডিফল্টরূপে, শুধুমাত্র মানক প্রোটোকল অনুমোদিত। উদাহরণস্বরূপ ওয়েবসকেটগুলিকে অনুমতি দেওয়ার জন্য ws://আপনাকে এটিকে স্পষ্টভাবে অনুমতি দিতে হবে:

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

The. ফাইল প্রোটোকলকে কীভাবে অনুমতি দেওয়া যায় file://?

আপনি যদি এটির সংজ্ঞা দেওয়ার চেষ্টা করেন তবে এটি কাজ করবে না। পরিবর্তে, আপনি এটি filesystemপ্যারামিটার দিয়ে অনুমতি দেবেন :

content="default-src filesystem"

In. ইনলাইন স্ক্রিপ্ট এবং শৈলীর সংজ্ঞা কীভাবে ব্যবহার করবেন?

সুস্পষ্টভাবে অনুমোদিত না হলে আপনি ইনলাইন স্টাইল সংজ্ঞা, <script>ট্যাগের ভিতরে কোড বা ট্যাগ বৈশিষ্ট্যগুলিতে ব্যবহার করতে পারবেন না onclick। আপনি তাদের মত অনুমতি দিন:

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

আপনাকে স্পষ্টভাবে ইনলাইন, বেস 64 এনকোডযুক্ত চিত্রগুলিও অনুমতি দিতে হবে:

content="img-src data:"

৮. কীভাবে অনুমতি দেবেন eval()?

আমি নিশ্চিত যে অনেক লোক বলে যে আপনি তা করবেন না, যেহেতু 'alভালটি মন্দ' 'এবং পৃথিবীর আসন্ন শেষের সর্বাধিক কারণ cause এই লোকেরা ভুল হবে। অবশ্যই, আপনি অবশ্যই স্পষ্টভাবে আপনার সাইটের সুরক্ষার মধ্যে প্রধান গর্তগুলি ঘুষি মারতে পারেন, তবে এটির ক্ষেত্রে পুরোপুরি বৈধ ব্যবহারের ঘটনা রয়েছে। আপনি এটি ব্যবহার সম্পর্কে স্মার্ট হতে হবে। আপনি এটি এর মত অনুমতি দিন:

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

9. হুবহু মানে 'self'কি?

আপনি 'self'স্থানীয় হোস্ট, স্থানীয় ফাইল সিস্টেম বা একই হোস্টের কিছু বোঝাতে পারেন । এর অর্থ এইগুলির কোনও নয়। এর অর্থ সূত্রগুলি যা একই স্কিম (প্রোটোকল), একই হোস্ট এবং একই পোর্ট বিষয়বস্তু নীতি হিসাবে সংজ্ঞায়িত ফাইল হিসাবে আছে HT HTTP- র মাধ্যমে আপনার সাইট পরিবেশন করছে? আপনার জন্য কোনও https নেই, যদি না আপনি এটিকে স্পষ্টভাবে সংজ্ঞায়িত করেন।

আমি 'self'বেশিরভাগ উদাহরণগুলিতে ব্যবহার করেছি কারণ এটি এটিকে অন্তর্ভুক্ত করা সাধারণত বোধগম্য হয় তবে এটি কোনওভাবেই বাধ্যতামূলক নয়। আপনার প্রয়োজন না হলে এটি ছেড়ে দিন।

তবে এক মিনিটে ঝুলো! আমি কি কেবল এটি ব্যবহার content="default-src *"এবং এটি দিয়ে সম্পন্ন করতে পারি না ?

না the সুস্পষ্ট সুরক্ষিত দুর্বলতাগুলির পাশাপাশি, এটি আপনার প্রত্যাশার মতো কাজ করবে না। যদিও কিছু ডক্স দাবি করে যে এটি কোনও কিছুর অনুমতি দেয়, এটি সত্য নয়। এটি ইনলাইনিং বা বিস্ফোরনের অনুমতি দেয় না, সুতরাং সত্যই সত্যই আপনার সাইটটিকে অতিরিক্ত দুর্বল করে তুলবে, আপনি এটি ব্যবহার করবেন:

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

... তবে আমি বিশ্বাস করি আপনি তা করবেন না।

আরও পড়া:

http://content-security-policy.com

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


6
দুর্দান্ত পোস্ট। একটি জিনিস: একাধিক নির্দেশিকা নির্দিষ্ট করা হলে কী ঘটে তা স্পষ্ট নয়; উদাহরণস্বরূপ 3 স্টাইল-এসসিআর সেটিংস ডিফল্ট-এসসিআর এর চেয়ে বেশি অগ্রাধিকার নেয়? ইত্যাদি ...
21

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 ব্যবহারকারী অজানা ব্লগার থেকে সামগ্রী অনুলিপি করার সম্ভাবনা কম বলে মনে হচ্ছে - আমি জানি আমি তা করি নি।
শ্লাউস

2
সম্পর্কিত connect-srcও পাথগুলি সম্পর্কে সংক্ষিপ্ত নোট : আপনি যদি একটি সম্পূর্ণ সাবপাথ অন্তর্ভুক্ত করতে চান তবে পিছনে স্ল্যাশগুলি বাধ্যতামূলক। উদাহরণস্বরূপ: http://foo.com/files/bar.txtউত্সটি থাকলে ফাইলটি ব্লক করা হবে http://foo.com/files, তবে এটি দেওয়া হবেhttp://foo.com/files/
গ্রিডো

15

এপাচ 2 মোড_এইডার্স

আপনি অ্যাপাচি 2 মড_হেডারগুলি সক্ষম করতে পারেন, ফেডোরায় এটি ইতিমধ্যে ডিফল্টরূপে সক্ষম হয়েছে, আপনি যদি উবুন্টু / দেবিয়ান ব্যবহার করেন তবে এটি এটি সক্ষম করুন:

# 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 টি প্রবেশিকা সিএসপি সেটিংস।

প্রথম প্যারামিটারটি নির্দেশিকা, দ্বিতীয়টি হ'ল সাদা তালিকাভুক্ত হওয়ার উত্স। আমি গুগল অ্যানালিটিক্স এবং একটি অ্যাডভারভার যুক্ত করেছি, যা আপনার থাকতে পারে। তদুপরি আমি দেখতে পেলাম যে আপনার যদি উপাধি রয়েছে, যেমন, www.example.com এবং উদাহরণ.কম অ্যাপাচি 2 তে কনফিগার করা হয়েছে তবে আপনার সেগুলি সাদা তালিকাতেও যুক্ত করা উচিত।

ইনলাইন কোড ক্ষতিকারক হিসাবে বিবেচিত হয়, আপনার এটি এড়ানো উচিত। সমস্ত জাভাস্ক্রিপ্ট এবং সিএসএস ফাইল অনুলিপি করতে এবং সেগুলি সাদা-তালিকায় যুক্ত করুন।

আপনি এটির সময়ে আপনি অন্যান্য শিরোনামের সেটিংসটি একবার দেখে নিতে পারেন এবং মোড_সিকিউরিটি ইনস্টল করতে পারেন

আরও পড়া:

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

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


2
আমি আমার .htaccess ফাইলটিতে সেই একই দিকনির্দেশগুলি যুক্ত করতে সক্ষম হয়েছি, যেহেতু আমার ভাগ করা হোস্টে অ্যাপাচি কনফিগারেশনগুলি সম্পাদনা করার ক্ষমতা আমার নেই। আমি এই সেটিংগুলি প্রতিবেদন- ইউরিও / হোম / টোলে সমন্বয় করার জন্য দুর্দান্ত সরঞ্জাম পেয়েছি
মাইকেল ম্যাকগিনিস

টমকাট with দিয়ে এটি সমাধান করার কোনও উপায় আছে I. আমি ফিল্টারগুলি যুক্ত করার চেষ্টা করেছি এবং কাজ করে নি।
এলশান

0

হরফ-এসসিআর সম্পর্কে ভুলে যাবেন না এটি অন্য যে কোনওর মতোই কাজ করে তবে আপনি যদি অন্য উত্স থেকে লোডযুক্ত ফন্টগুলি ব্যবহার করেন - তবে আপনি এটি মেটা ট্যাগে যুক্ত করেছেন তা নিশ্চিত করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.