javascript কিভাবে অ্যাক্সেস-কন্ট্রোল-অনুমতি-মূল শিরোনাম কাজ করে?





5 Answers

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

  1. রিমোট / সিলভারলাইট বা সার্ভারের পাশটিকে দূরবর্তী সঙ্গে যোগাযোগ করতে "প্রক্সি" হিসাবে ব্যবহার করুন।
  2. প্যাডিং সহ JSON ( JSONP )।
  3. একটি আইফ্রেমে রিমোট সার্ভার এম্বেড করে এবং বিভাজক বা window.name এর মাধ্যমে যোগাযোগ করে, here পড়ুন।

এই চতুর পদ্ধতিগুলিতে কম বা কিছু সমস্যা রয়েছে, উদাহরণস্বরূপ, JSONP যদি সুরক্ষাগুলি সহজে "eval" করে এবং এটি উপরে # 3 উপরে সুরক্ষার গহ্বর হতে পারে তবে এটি ডোমেনগুলি একে অপরের মধ্যে কঠোর চুক্তি তৈরি করতে পারে, এটি নমনীয় না মার্জিত এই প্রোগ্রামটিতে :)

W3C ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) একটি নিরাপদ, নমনীয় এবং এই সমস্যার সমাধান করার প্রস্তাবিত আদর্শ উপায় সরবরাহ করার জন্য একটি আদর্শ সমাধান হিসাবে চালু করেছে।

প্রক্রিয়া

একটি উচ্চ স্তরের থেকে আমরা কেবলমাত্র CORS ডোমেন A থেকে ক্লায়েন্ট AJAX কল এবং ডোমেন B এ হোস্ট করা একটি পৃষ্ঠার মধ্যে চুক্তিটি স্বীকার করতে পারি, একটি সাধারণ ক্রস-মূল অনুরোধ / প্রতিক্রিয়া হবে:

ডোমেইন এ AJAX অনুরোধ শিরোনাম

Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com 

ডোমেইনবি প্রতিক্রিয়া শিরোনাম

Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive

উপরে বর্ণিত নীল অংশগুলি কার্নেলের ঘটনা, "মূল" অনুরোধের শিরোনাম "নির্দেশ করে যে ক্রস-উৎপত্তি অনুরোধ বা প্রফ্লাইট অনুরোধটি কীভাবে উদ্ভূত হয়", "অ্যাক্সেস-কন্ট্রোল-অনুমতি-মূল-মূল" প্রতিক্রিয়া শিরোনাম নির্দেশ করে যে এই পৃষ্ঠাটি থেকে দূরবর্তী অনুরোধের অনুমতি দেয় ডোমেনএ (মানটি যদি * নির্দেশক কোন ডোমেন থেকে দূরবর্তী অনুরোধের অনুমতি দেয়)।

আমি উপরে উল্লিখিত হিসাবে, W3 প্রকৃতপক্ষে ক্রস-মূল HTTP অনুরোধ জমা দেওয়ার আগে একটি "প্রিফ্লাইট অনুরোধ " বাস্তবায়ন করার জন্য ব্রাউজারকে প্রস্তাবিত করে, এটি একটি HTTP OPTIONS অনুরোধের সংক্ষেপে:

OPTIONS DomainB.com/foo.aspx HTTP/1.1

যদি foo.aspx OPTIONS HTTP ক্রিয়া সমর্থন করে তবে এটি নীচের মত প্রতিক্রিয়া ফিরিয়ে দিতে পারে:

HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json

শুধুমাত্র প্রতিক্রিয়াটিতে যদি "অ্যাক্সেস-কন্ট্রোল-অনুমতি-অরিজিন" থাকে এবং এটির মানটি "*" বা "COORS অনুরোধটি জমা দেওয়ার ডোমেন ধারণ করে তবে এই বাধ্যতামূলক শর্তটি সন্তুষ্ট করে ব্রাউজার প্রকৃত ক্রস ডোমেন অনুরোধ জমা দেবে এবং ফলাফলটি ক্যাশে করবে " Preflight- ফলাফল-ক্যাশে "।

আমি তিন বছর আগে CORS সম্পর্কে ব্লগ করেছি: AJAX ক্রস-মূল HTTP অনুরোধ

javascript cross-domain cors

দৃশ্যত, আমি সম্পূর্ণরূপে তার semantics ভুল বুঝেছি। আমি এই মত কিছু চিন্তা:

  1. একটি ক্লায়েন্ট http: // siteA - origin থেকে জাভাস্ক্রিপ্ট কোড MyCode.js ডাউনলোড করে।
  2. MyCode.js এর প্রতিক্রিয়া শিরোনাম অ্যাক্সেস-কন্ট্রোল- এঞ্জেলেস -অরিজিন: http: // সাইটবি , যা আমি মনে করি তার মানে বোঝানো হয়েছে যে MyCode.js সাইট বিতে ক্রস-উত্স রেফারেন্স তৈরি করার অনুমতি দেওয়া হয়েছিল।
  3. ক্লায়েন্ট MyCode.js এর কিছু কার্যকারিতা ট্রিগার করে, যা ক্রস-উৎপত্তি অনুরোধগুলি সত্ত্বেও http: // siteB তে অনুরোধ করে, যা জরিমানা হওয়া উচিত।

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

এক জিনিস নিশ্চিত - আমি এখনও এই শিরোনাম ব্যবহার করা অনুমিত হয় না বুঝতে পারছি না।

আমার সাইট এ এবং সাইট বি উভয়ের সম্পূর্ণ নিয়ন্ত্রণ আছে। আমি কীভাবে সাইট A থেকে ডাউনলোড হওয়া জাভাস্ক্রিপ্ট কোডটি এই শিরোনামের সাহায্যে সাইট B এ সংস্থানগুলি অ্যাক্সেস করতে সক্ষম করব?

দ্রষ্টব্য

আমি JSONP ব্যবহার করতে চান না।




যদি আপনি কেবল একটি ক্রস ডোমেন অ্যাপ্লিকেশন পরীক্ষা করতে চান যার মধ্যে ব্রাউজার আপনার অনুরোধটি ব্লক করে তবে আপনি কেবল আপনার ব্রাউজারটি অনিরাপদ মোডে খুলতে পারেন এবং আপনার কোডটি পরিবর্তন না করে এবং আপনার কোডটি অনিরাপদ করেই আপনার অ্যাপ্লিকেশনটি পরীক্ষা করতে পারেন। ম্যাক অপারেটিং সিস্টেম থেকে আপনি টার্মিনাল লাইন থেকে এটি করতে পারেন:

open -a Google\ Chrome --args --disable-web-security --user-data-dir



1. একটি ক্লায়েন্ট http: // siteA - origin থেকে জাভাস্ক্রিপ্ট কোড MyCode.js ডাউনলোড করে।

ডাউনলোড করার কোডটি - আপনার এইচটিএমএল স্ক্রিপ্ট ট্যাগ বা জাভাস্ক্রিপ্ট থেকে xhr অথবা যাই হোক না কেন - আসুন, http: // siteZ । এবং, যখন ব্রাউজার MyCode.js কে অনুরোধ করে, তখন এটি একটি উত্স প্রেরণ করে : শিরোনামটি "মূল: http: // siteZ " বলে, কারণ এটি দেখতে পারে যে আপনি সাইটএ এবং সাইটজে! = SiteA এর জন্য অনুরোধ করছেন। (আপনি এটিকে থামাতে বা হস্তক্ষেপ করতে পারবেন না।)

2. MyCode.js এর প্রতিক্রিয়া শিরোনাম অ্যাক্সেস-কন্ট্রোল-অনুমতি-অরিজিন: http: // সাইট বি, যা আমি মনে করি তার মানে বোঝানো হয়েছে যে MyCode.js সাইট বিতে ক্রস-উত্স রেফারেন্স তৈরি করার অনুমতি দেওয়া হয়েছিল।

কোন। এর মানে হল, শুধুমাত্র সাইটবিকে এই অনুরোধটি করার অনুমতি দেওয়া হয়েছে। সাইট সাইট থেকে MyCode.js এর জন্য আপনার অনুরোধটি পরিবর্তে একটি ত্রুটি পায় এবং ব্রাউজার সাধারণত আপনাকে কিছুই দেয় না। কিন্তু আপনি যদি আপনার সার্ভার ACAO ফেরত দেন: পরিবর্তে সাইটজেড, আপনি MyCode.js পাবেন। অথবা যদি এটি '*' পাঠায়, এটি কাজ করবে, এটি সবাইকে সরিয়ে দেবে। অথবা সার্ভার সর্বদা মূল থেকে স্ট্রিং পাঠায়: হেডার ... কিন্তু ... নিরাপত্তার জন্য, যদি আপনি হ্যাকারদের ভয় পান , আপনার সার্ভারটি শুধুমাত্র একটি শর্টলিস্টে উত্সগুলিকে অনুমতি দেয়, যা সেই অনুরোধগুলি করার অনুমতি দেয়।

তারপর, MyCode.js সাইট এ থেকে আসে। যখন এটি সাইটবিকে অনুরোধ করে, তখন তারা সমস্ত ক্রস-উৎপত্তি হয়, ব্রাউজারটি মূলটি পাঠায়: সাইট এ এবং সাইটবিকে সাইটটি নিতে হবে, এটি অনুমোদিত অনুরোধকারীদের সংক্ষিপ্ত তালিকায় আছে এবং ACAO: siteA পাঠাও। শুধুমাত্র তখন ব্রাউজারটি আপনার স্ক্রিপ্টগুলিকে সেই অনুরোধগুলির ফলাফল পেতে দেবে।




যখনই আমি CORS সম্পর্কে ভাবতে শুরু করি, আমার অন্তর্দৃষ্টিটি কোন সাইটের শিরোনাম হোস্ট করে সেটি ভুল, ঠিক যেমন আপনি আপনার প্রশ্নের বর্ণনা দিয়েছেন। আমার জন্য, এটি একই মূল নীতির উদ্দেশ্য সম্পর্কে চিন্তা করতে সহায়তা করে।

একই মূল নীতিটির উদ্দেশ্য হল সাইট A.com এ দূষিত জাভাস্ক্রিপ্ট থেকে আপনি কেবলমাত্র সাইটবোটের সাথে ভাগ করে নেওয়ার জন্য যে ব্যক্তিগত তথ্যটি চয়ন করেছেন সেটি অ্যাক্সেস করার জন্য। একই মূল নীতি ছাড়া, সাইট A.com এর লেখকদের দ্বারা লিখিত জাভাস্ক্রিপ্ট siteB.com এর জন্য আপনার প্রমাণীকরণ কুকি ব্যবহার করে সাইটবটমে অনুরোধ করতে পারে। এইভাবে, siteA.com সাইটB.com এর সাথে ভাগ করা গোপন তথ্য চুরি করতে পারে।

কখনও কখনও আপনাকে অবশ্যই ক্রস ডোমেনটি কাজ করতে হবে, যেখানে CORS আসে। CORS ডোমেন A.com এর জন্য একই মূল নীতিটি শিথিল করে, Access-Control-Allow-Origin শিরোনামটি ব্যবহার করে অন্য ডোমেনগুলি (ডোমেনবোট) যেগুলি চালানোর জন্য বিশ্বস্ত ডোমেন A.com সঙ্গে যোগাযোগ করতে পারেন যে জাভাস্ক্রিপ্ট।

বোঝার জন্য কোন ডোমেনটি CORS হেডারগুলি পরিবেশন করা উচিত তা বিবেচনা করুন। আপনি malicious.com এ যান, যা কিছু জাভাস্ক্রিপ্ট রয়েছে যা mybank.com এ ক্রস ডোমেন অনুরোধ করার চেষ্টা করে। এটা mybank.com নয়, malicious.com নয়, এটি CORS হেডার সেট করে কিনা তা নির্ধারণ করার জন্য, একই মূল নীতিটিকে জাভাস্ক্রিপ্ট থেকে malicious.com এর সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয় কিনা তা নির্ধারণ করতে হবে। Malicous.com যদি নিজের নিজের জাভাস্ক্রিপ্ট অ্যাক্সেসটি mybank.com এ অ্যাক্সেসের অনুমতি দেয় তবে এটি নিজের মূল CORS হেডার সেট করতে পারে, এটি সম্পূর্ণভাবে একই মূল নীতিটিকে বাতিল করে দেবে।

আমি মনে করি আমার খারাপ অন্তর্দৃষ্টিটির কারণটি এমন একটি দৃষ্টিকোণ যা আমার কাছে একটি সাইট তৈরির সময়। এটি আমার সাইট, আমার সমস্ত জাভাস্ক্রিপ্টের সাথে, তাই এটি দূষিত কিছু করছে না এবং আমার জাভাস্ক্রিপ্ট কোনও সাইটগুলির সাথে যোগাযোগ করতে পারে তা নির্দিষ্ট করার জন্য এটি আমার কাছে থাকা উচিত। আসলে যখন আমার মনে হয় যে কোন সাইটগুলি জাভাস্ক্রিপ্ট আমার সাইটের সাথে যোগাযোগ করার চেষ্টা করছে এবং আমি তাদের অনুমতি দেওয়ার জন্য CORS ব্যবহার করব?




ক্রস উত্স ভাগ করার জন্য, সেট হেডার: 'Access-Control-Allow-Origin':'*';

Php: header('Access-Control-Allow-Origin':'*');

নোড: app.use('Access-Control-Allow-Origin':'*');

এটি বিভিন্ন ডোমেনের জন্য সামগ্রী ভাগ করার অনুমতি দেবে।




Related