ফেচ মেটাডেটা দিয়ে ওয়েব আক্রমণ থেকে আপনার সম্পদ রক্ষা করুন

CSRF, XSSI, এবং ক্রস-অরিজিন তথ্য ফাঁস প্রতিরোধ করুন।

অনেক ওয়েব অ্যাপ্লিকেশন ক্রস-অরিজিন আক্রমণ যেমন ক্রস-সাইট রিকোয়েস্ট ফোরজি (CSRF), ক্রস-সাইট স্ক্রিপ্ট ইনক্লুশন (XSSI), টাইমিং অ্যাটাক, ক্রস-অরিজিন ইনফরমেশন লিক বা অনুমানমূলক এক্সিকিউশন সাইড-চ্যানেল ( স্পেকটার ) আক্রমণের জন্য ঝুঁকিপূর্ণ।

মেটাডেটা রিকোয়েস্ট হেডার আনয়ন আপনাকে এই সাধারণ ক্রস-অরিজিন অ্যাটাকগুলির বিরুদ্ধে আপনার অ্যাপ্লিকেশানকে সুরক্ষিত করতে একটি শক্তিশালী ডিফেন্স-ইন-ডেপ্থ মেকানিজম-একটি রিসোর্স আইসোলেশন পলিসি- স্থাপন করার অনুমতি দেয়।

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

ব্রাউজার সামঞ্জস্য

সমস্ত আধুনিক ব্রাউজার ইঞ্জিনে মেটাডেটা রিকোয়েস্ট হেডারগুলি সমর্থিত।

ব্রাউজার সমর্থন

  • ক্রোম: 76।
  • প্রান্ত: 79।
  • ফায়ারফক্স: 90।
  • সাফারি: 16.4.

উৎস

পটভূমি

অনেক ক্রস-সাইট আক্রমণ সম্ভব কারণ ওয়েব ডিফল্টরূপে খোলা থাকে এবং আপনার অ্যাপ্লিকেশন সার্ভার সহজেই বহিরাগত অ্যাপ্লিকেশন থেকে উদ্ভূত যোগাযোগ থেকে নিজেকে রক্ষা করতে পারে না। একটি সাধারণ ক্রস-অরিজিন অ্যাটাক হল ক্রস-সাইট রিকোয়েস্ট ফোরজি (CSRF) যেখানে একজন আক্রমণকারী একজন ব্যবহারকারীকে তাদের নিয়ন্ত্রণ করে এমন সাইটের দিকে প্রলুব্ধ করে এবং তারপর ব্যবহারকারী যে সার্ভারে লগ ইন করেছে সেখানে একটি ফর্ম জমা দেয়। যেহেতু সার্ভার বলতে পারে না অনুরোধটি অন্য ডোমেন (ক্রস-সাইট) থেকে এসেছে কিনা এবং ব্রাউজার স্বয়ংক্রিয়ভাবে ক্রস-সাইট অনুরোধে কুকি সংযুক্ত করে, তাই সার্ভার ব্যবহারকারীর পক্ষ থেকে আক্রমণকারীর অনুরোধ করা পদক্ষেপটি কার্যকর করবে।

ক্রস-সাইট স্ক্রিপ্ট ইনক্লুশন (XSSI) বা ক্রস-অরিজিন তথ্য ফাঁসের মতো অন্যান্য ক্রস-সাইট আক্রমণগুলি CSRF-এর মতোই এবং আক্রমণকারী-নিয়ন্ত্রিত নথিতে শিকার অ্যাপ্লিকেশন থেকে সংস্থানগুলি লোড করা এবং শিকারের অ্যাপ্লিকেশন সম্পর্কে তথ্য ফাঁস করার উপর নির্ভর করে। যেহেতু অ্যাপ্লিকেশনগুলি অবিশ্বস্ত ব্যক্তিদের থেকে বিশ্বস্ত অনুরোধগুলিকে সহজেই আলাদা করতে পারে না, তাই তারা দূষিত ক্রস-সাইট ট্র্যাফিক বাতিল করতে পারে না৷

মেটাডেটা আনয়ন করা হচ্ছে

মেটাডেটা রিকোয়েস্ট হেডার আনয়ন হল একটি নতুন ওয়েব প্ল্যাটফর্ম নিরাপত্তা বৈশিষ্ট্য যা সার্ভারগুলিকে ক্রস-অরিজিন আক্রমণ থেকে রক্ষা করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। Sec-Fetch-* শিরোনামগুলির একটি সেটে একটি HTTP অনুরোধের প্রেক্ষাপট সম্পর্কে তথ্য প্রদান করে, তারা অনুরোধটি প্রক্রিয়া করার আগে প্রতিক্রিয়াকারী সার্ভারকে নিরাপত্তা নীতি প্রয়োগ করার অনুমতি দেয়। এটি ডেভেলপারদের একটি অনুরোধ গ্রহণ বা প্রত্যাখ্যান করার পদ্ধতির উপর ভিত্তি করে সিদ্ধান্ত নিতে দেয় এবং এটি যে প্রেক্ষাপটে ব্যবহার করা হবে তার উপর ভিত্তি করে, এটি তাদের নিজস্ব আবেদনের দ্বারা করা শুধুমাত্র বৈধ অনুরোধের প্রতিক্রিয়া জানাতে সক্ষম করে।

একই-উৎপত্তি
আপনার নিজস্ব সার্ভার (একই-অরিজিন) দ্বারা পরিবেশিত সাইটগুলি থেকে উদ্ভূত অনুরোধগুলি কাজ চালিয়ে যাবে। জাভাস্ক্রিপ্টে https://site.example/foo.json রিসোর্সের জন্য একটি আনার অনুরোধ ব্রাউজারকে HTTP অনুরোধ শিরোনাম 'Sec Fetch-Site: same-origin' পাঠাতে বাধ্য করে।
ক্রস-সাইট
Sec-Fetch-* শিরোনাম দ্বারা প্রদত্ত HTTP অনুরোধে অতিরিক্ত প্রসঙ্গের কারণে ক্ষতিকারক ক্রস-সাইট অনুরোধগুলি সার্ভার দ্বারা প্রত্যাখ্যান করা যেতে পারে৷ https://evil.example-এ একটি চিত্র যা একটি img উপাদানের src বৈশিষ্ট্যকে 'https://site.example/foo.json'-এ সেট করেছে ব্রাউজারকে HTTP অনুরোধের শিরোনাম পাঠাতে বাধ্য করে 'Sec-Fetch-Site: ক্রস-সাইট'।

Sec-Fetch-Site

ব্রাউজার সমর্থন

  • ক্রোম: 76।
  • প্রান্ত: 79।
  • ফায়ারফক্স: 90।
  • সাফারি: 16.4.

উৎস

Sec-Fetch-Site সার্ভারকে বলে যে কোন সাইটটি অনুরোধ পাঠিয়েছে। ব্রাউজার এই মানটিকে নিম্নলিখিতগুলির মধ্যে একটিতে সেট করে:

  • same-origin , যদি অনুরোধটি আপনার নিজের অ্যাপ্লিকেশন দ্বারা করা হয় (যেমন site.example )
  • same-site , যদি অনুরোধটি আপনার সাইটের একটি সাবডোমেন দ্বারা করা হয় (যেমন bar.site.example )
  • none , যদি অনুরোধটি স্পষ্টভাবে ব্যবহারকারী এজেন্টের সাথে ব্যবহারকারীর মিথস্ক্রিয়া দ্বারা সৃষ্ট হয় (যেমন একটি বুকমার্কে ক্লিক করা)
  • cross-site , যদি অনুরোধটি অন্য ওয়েবসাইট দ্বারা পাঠানো হয় (যেমন evil.example )

Sec-Fetch-Mode

ব্রাউজার সমর্থন

  • ক্রোম: 76।
  • প্রান্ত: 79।
  • ফায়ারফক্স: 90।
  • সাফারি: 16.4.

উৎস

Sec-Fetch-Mode অনুরোধের মোড নির্দেশ করে। এটি মোটামুটিভাবে অনুরোধের প্রকারের সাথে মিলে যায় এবং আপনাকে নেভিগেশন অনুরোধ থেকে রিসোর্স লোডগুলিকে আলাদা করতে দেয়৷ উদাহরণস্বরূপ, navigate একটি গন্তব্য একটি শীর্ষ-স্তরের নেভিগেশন অনুরোধ নির্দেশ করে যখন no-cors একটি ছবি লোড করার মতো সংস্থান অনুরোধগুলি নির্দেশ করে৷

Sec-Fetch-Dest

ব্রাউজার সমর্থন

  • ক্রোম: 80।
  • প্রান্ত: 80।
  • ফায়ারফক্স: 90।
  • সাফারি: 16.4.

উৎস

Sec-Fetch-Dest একটি অনুরোধের গন্তব্য প্রকাশ করে (যেমন যদি একটি script বা একটি img ট্যাগ ব্রাউজার দ্বারা একটি সংস্থান অনুরোধ করা হয়)।

ক্রস-অরিজিন আক্রমণ থেকে রক্ষা করার জন্য মেটাডেটা ফেচ কিভাবে ব্যবহার করবেন

এই অনুরোধের শিরোনামগুলি যে অতিরিক্ত তথ্য প্রদান করে তা বেশ সহজ, তবে অতিরিক্ত প্রসঙ্গ আপনাকে সার্ভার-সাইডে শক্তিশালী সুরক্ষা যুক্তি তৈরি করতে দেয়, যাকে রিসোর্স আইসোলেশন নীতি হিসাবেও উল্লেখ করা হয়, কোডের কয়েকটি লাইন সহ।

একটি সম্পদ বিচ্ছিন্নকরণ নীতি বাস্তবায়ন

একটি রিসোর্স আইসোলেশন পলিসি আপনার রিসোর্সগুলিকে বহিরাগত ওয়েবসাইটগুলির দ্বারা অনুরোধ করা থেকে বাধা দেয়৷ এই ধরনের ট্রাফিক ব্লক করা CSRF, XSSI, টাইমিং অ্যাটাক এবং ক্রস-অরিজিন তথ্য ফাঁসের মতো সাধারণ ক্রস-সাইট ওয়েব দুর্বলতাগুলিকে প্রশমিত করে। এই নীতিটি আপনার অ্যাপ্লিকেশনের সমস্ত প্রান্তের জন্য সক্ষম করা যেতে পারে এবং আপনার নিজের অ্যাপ্লিকেশন থেকে আসা সমস্ত সংস্থান অনুরোধের পাশাপাশি সরাসরি নেভিগেশন (একটি HTTP GET অনুরোধের মাধ্যমে) অনুমতি দেবে৷ একটি ক্রস-সাইট প্রসঙ্গে (যেমন CORS ব্যবহার করে লোড হওয়া এন্ডপয়েন্ট) এন্ডপয়েন্টগুলিকে এই যুক্তি থেকে অপ্ট আউট করা যেতে পারে৷

ধাপ 1: ব্রাউজার থেকে অনুরোধের অনুমতি দিন যা মেটাডেটা আনয়ন পাঠায় না

যেহেতু সমস্ত ব্রাউজার ফেচ মেটাডেটা সমর্থন করে না, সেহেতু আপনাকে sec-fetch-site উপস্থিতি পরীক্ষা করে Sec-Fetch-* শিরোনাম সেট করে না এমন অনুরোধগুলিকে অনুমতি দিতে হবে।

if not req['sec-fetch-site']:
  return True  # Allow this request

ধাপ 2: একই-সাইট এবং ব্রাউজার-প্রবর্তিত অনুরোধের অনুমতি দিন

ক্রস-অরিজিন প্রসঙ্গ (যেমন evil.example ) থেকে উদ্ভূত নয় এমন যেকোনো অনুরোধের অনুমতি দেওয়া হবে। বিশেষ করে, এই অনুরোধগুলি হল:

  • আপনার নিজের অ্যাপ্লিকেশন থেকে উদ্ভূত (যেমন একটি একই-অরিজিন অনুরোধ যেখানে site.example অনুরোধ site.example/foo.json সবসময় অনুমতি দেওয়া হবে)।
  • আপনার সাবডোমেন থেকে উদ্ভূত.
  • স্পষ্টভাবে ব্যবহারকারী এজেন্টের সাথে ব্যবহারকারীর মিথস্ক্রিয়া দ্বারা সৃষ্ট হয় (যেমন সরাসরি নেভিগেশন বা বুকমার্কে ক্লিক করে ইত্যাদি)।
if req['sec-fetch-site'] in ('same-origin', 'same-site', 'none'):
  return True  # Allow this request

ধাপ 3: সহজ শীর্ষ-স্তরের নেভিগেশন এবং iframing অনুমতি দিন

আপনার সাইটটি এখনও অন্যান্য সাইট থেকে লিঙ্ক করা যেতে পারে তা নিশ্চিত করতে, আপনাকে সহজ ( HTTP GET ) শীর্ষ-স্তরের নেভিগেশনের অনুমতি দিতে হবে।

if req['sec-fetch-mode'] == 'navigate' and req.method == 'GET'
  # <object> and <embed> send navigation requests, which we disallow.
  and req['sec-fetch-dest'] not in ('object', 'embed'):
    return True  # Allow this request

ধাপ 4: ক্রস-সাইট ট্র্যাফিক পরিবেশন করার জন্য শেষ পয়েন্টগুলি অপ্ট আউট করুন (ঐচ্ছিক)

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

  • ক্রস-অরিজিন অ্যাক্সেস করার জন্য এন্ডপয়েন্ট: যদি আপনার অ্যাপ্লিকেশনটি CORS সক্ষম করা এন্ডপয়েন্টগুলি পরিবেশন করে, তাহলে আপনাকে স্পষ্টভাবে সেগুলিকে রিসোর্স আইসোলেশন থেকে অপ্ট আউট করতে হবে যাতে এই এন্ডপয়েন্টগুলিতে ক্রস-সাইট অনুরোধগুলি এখনও সম্ভব।
  • পাবলিক রিসোর্স (যেমন ইমেজ, শৈলী, ইত্যাদি): যেকোন পাবলিক এবং অপ্রমাণিত রিসোর্স যা অন্যান্য সাইট থেকে ক্রস-অরিজিন লোডযোগ্য হওয়া উচিত সেইসাথে ছাড় দেওয়া যেতে পারে।
if req.path in ('/my_CORS_endpoint', '/favicon.png'):
  return True

ধাপ 5: অন্য সমস্ত অনুরোধ প্রত্যাখ্যান করুন যেগুলি ক্রস-সাইট এবং নেভিগেশনাল নয়

অন্য কোনো ক্রস-সাইট অনুরোধ এই সম্পদ বিচ্ছিন্নকরণ নীতি দ্বারা প্রত্যাখ্যান করা হবে এবং এইভাবে আপনার আবেদনকে সাধারণ ক্রস-সাইট আক্রমণ থেকে রক্ষা করবে।

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

# Reject cross-origin requests to protect from CSRF, XSSI, and other bugs
def allow_request(req):
  # Allow requests from browsers which don't send Fetch Metadata
  if not req['sec-fetch-site']:
    return True

  # Allow same-site and browser-initiated requests
  if req['sec-fetch-site'] in ('same-origin', 'same-site', 'none'):
    return True

  # Allow simple top-level navigations except <object> and <embed>
  if req['sec-fetch-mode'] == 'navigate' and req.method == 'GET'
    and req['sec-fetch-dest'] not in ('object', 'embed'):
      return True

  # [OPTIONAL] Exempt paths/endpoints meant to be served cross-origin.
  if req.path in ('/my_CORS_endpoint', '/favicon.png'):
    return True

  # Reject all other requests that are cross-site and not navigational
  return False

একটি সম্পদ বিচ্ছিন্নকরণ নীতি স্থাপন করা হচ্ছে

  1. আপনার সাইট কীভাবে আচরণ করে তা লগ করতে এবং নিরীক্ষণ করতে উপরে থেকে কোড স্নিপেটের মতো একটি মডিউল ইনস্টল করুন এবং নিশ্চিত করুন যে বিধিনিষেধগুলি কোনও বৈধ ট্রাফিককে প্রভাবিত করে না৷
  2. বৈধ ক্রস-অরিজিন এন্ডপয়েন্টকে ছাড় দিয়ে সম্ভাব্য লঙ্ঘন ঠিক করুন।
  3. অ-অনুশীলন অনুরোধ বাদ দিয়ে নীতি প্রয়োগ করুন।

নীতি লঙ্ঘন চিহ্নিত করা এবং ঠিক করা

এটি সুপারিশ করা হয় যে আপনি আপনার সার্ভার-সাইড কোডে রিপোর্টিং মোডে এটি সক্রিয় করে একটি পার্শ্ব-প্রতিক্রিয়া মুক্ত উপায়ে আপনার নীতি পরীক্ষা করুন৷ বিকল্পভাবে, আপনি মিডলওয়্যারে বা বিপরীত প্রক্সিতে এই যুক্তিটি প্রয়োগ করতে পারেন যা উত্পাদন ট্র্যাফিকের ক্ষেত্রে প্রয়োগ করার সময় আপনার নীতি তৈরি করতে পারে এমন কোনও লঙ্ঘন লগ করে।

Google-এ মেটাডেটা রিসোর্স আইসোলেশন পলিসি নিয়ে আসার আমাদের অভিজ্ঞতা থেকে, বেশিরভাগ অ্যাপ্লিকেশানগুলি ডিফল্টভাবে এই জাতীয় নীতির সাথে সামঞ্জস্যপূর্ণ এবং ক্রস-সাইট ট্র্যাফিকের অনুমতি দেওয়ার জন্য খুব কমই এন্ডপয়েন্ট ছাড়ের প্রয়োজন হয়৷

একটি সম্পদ বিচ্ছিন্নকরণ নীতি কার্যকর করা

আপনি যাচাই করার পরে যে আপনার নীতি বৈধ উৎপাদন ট্র্যাফিককে প্রভাবিত করে না, আপনি বিধিনিষেধ প্রয়োগ করতে প্রস্তুত, গ্যারান্টি দিয়ে যে অন্যান্য সাইটগুলি আপনার সংস্থানগুলির অনুরোধ করতে সক্ষম হবে না এবং ক্রস-সাইট আক্রমণ থেকে আপনার ব্যবহারকারীদের রক্ষা করবে৷

আরও পড়া