আমরা এমন একটি এপিআই প্রকাশ করছি যা অংশীদাররা কেবলমাত্র আমাদের সাথে নিবন্ধিত ডোমেনগুলিতেই ব্যবহার করতে পারে। এর বিষয়বস্তু আংশিক পাবলিক (তবে কেবলমাত্র আমরা জানি এমন ডোমেনগুলিতে প্রদর্শিত হবে) তবে এটি বেশিরভাগ ক্ষেত্রেই আমাদের ব্যবহারকারীদের কাছে ব্যক্তিগত। সুতরাং:
কী দেখানো হয়েছে তা নির্ধারণ করতে, আমাদের ব্যবহারকারীকে অবশ্যই আমাদের সাথে লগ ইন করতে হবে, তবে এটি আলাদাভাবে পরিচালনা করা হয়।
নির্ধারণ যেখানে ডেটা দেখানো হয় একটি সর্বজনীন API কী ডোমেইনের আমরা জানতে সীমা অ্যাক্সেস করতে ব্যবহার করা হয়, এবং সর্বোপরি ব্যক্তিগত ব্যবহারকারীর তথ্য নিশ্চিত করার প্রবন নয় CSRF ।
এই এপিআই কীটি অবশ্যই সবার কাছে দৃশ্যমান, আমরা আমাদের অংশীদারকে অন্য কোনও উপায়ে প্রমাণীকরণ করি না এবং আমাদের রেফারের প্রয়োজন নেই । তবুও, এটি সুরক্ষিত:
যখন আমাদের get-csrf-token.js?apiKey=abc123
অনুরোধ করা হয়:
abc123
ডাটাবেসে কীটি অনুসন্ধান করুন এবং সেই কীটির জন্য বৈধ ডোমেনগুলির একটি তালিকা পান।
সিএসআরএফ বৈধতা কুকি জন্য সন্ধান করুন। যদি এটি বিদ্যমান না থাকে তবে একটি নিরাপদ র্যান্ডম মান উত্পন্ন করুন এবং এটি কেবলমাত্র HTTP- র সেশন কুকিতে রাখুন। কুকি যদি উপস্থিত না থাকে তবে বিদ্যমান এলোমেলো মানটি পান।
এপিআই কী থেকে একটি সিএসআরএফ টোকেন এবং কুকি থেকে এলোমেলো মান তৈরি করুন এবং এতে স্বাক্ষর করুন । (সার্ভারে টোকেনের তালিকা রাখার পরিবর্তে আমরা মানগুলি স্বাক্ষর করছি Both উভয় মান স্বাক্ষরিত টোকেনে পাঠযোগ্য হবে, এটি ভাল))
ক্যাশে না হওয়ার জন্য প্রতিক্রিয়া সেট করুন, কুকি যুক্ত করুন এবং স্ক্রিপ্টের মতো ফিরে আসুন:
var apiConfig = apiConfig || {};
if(document.domain === 'expected-domain.com'
|| document.domain === 'www.expected-domain.com') {
apiConfig.csrfToken = 'API key, random value, signature';
if(typeof apiConfig.fnInit !== 'undefined') {
apiConfig.fnInit();
}
} else {
alert('This site is not authorised for this API key.');
}
মন্তব্য:
উপরেরগুলি কোনও সার্ভার সাইড স্ক্রিপ্টটিকে একটি অনুরোধ জাল করতে বাধা দেয় না, তবে কেবলমাত্র এটি নিশ্চিত করে যে কোনও ব্রাউজারের দ্বারা অনুরোধ করা থাকলে ডোমেনটি মেলে ।
জাভাস্ক্রিপ্ট জন্য একই মূল নীতি নিশ্চিত করে যে একটি ব্রাউজার লোড এবং তারপর জাভাস্ক্রিপ্ট সোর্স পরিদর্শন করা XHR (অ্যাজাক্স) ব্যবহার করতে পারবেন না। পরিবর্তে, একটি নিয়মিত ব্রাউজার কেবল এটি <script src="https://our-api.com/get-csrf-token.js?apiKey=abc123">
(বা গতিশীল সমতুল্য) ব্যবহার করে লোড করতে পারে এবং তারপরে কোডটি চালানো হবে। অবশ্যই, উত্পন্ন জাভাস্ক্রিপ্টের জন্য আপনার সার্ভারের ক্রস-অরিজিন রিসোর্স ভাগ করে নেওয়া বা জেএসএনপি সমর্থন করা উচিত নয় ।
document.domain
উপরের স্ক্রিপ্টটি লোড করার আগে একটি ব্রাউজার স্ক্রিপ্ট এর মান পরিবর্তন করতে পারে । কিন্তু একই উৎপত্তি নীতিটি কেবল দ্বারা ডোমেইন সংক্ষেপিত জন্য করতে পারবেন সরানোর উপসর্গ, rewriting মত subdomain.example.com
মাত্র example.com
, অথবা myblog.wordpress.com
করার wordpress.com
, অথবা এমনকি কিছু কিছু ব্রাউজারে bbc.co.uk
করতে co.uk
।
জাভাস্ক্রিপ্ট ফাইলটি যদি কিছু সার্ভার সাইড স্ক্রিপ্ট ব্যবহার করে আনা হয় তবে সার্ভারটিও কুকি পাবে। তবে তৃতীয় পক্ষের সার্ভার কোনও ব্যবহারকারীর ব্রাউজারকে আমাদের ডোমেনে কুকি সংযুক্ত করতে পারে না। সুতরাং, একটি সিএসআরএফ টোকেন এবং বৈধতা কুকি যা একটি সার্ভার সাইড স্ক্রিপ্ট ব্যবহার করে আনা হয়েছে, কেবল পরবর্তী সার্ভার সাইড কল দ্বারা ব্যবহার করা যেতে পারে, ব্রাউজারে নয়। তবে, এই জাতীয় সার্ভার সাইড কলগুলি কখনই ব্যবহারকারীর কুকিকে অন্তর্ভুক্ত করবে না এবং তাই কেবল সর্বজনীন ডেটা আনতে পারে। এটি কোনও একই সার্ভার সাইড স্ক্রিপ্ট অংশীদারের ওয়েবসাইট থেকে সরাসরি স্ক্র্যাপ করতে পারে।
যখন কোনও ব্যবহারকারী লগ ইন করে, আপনার পছন্দমতো কিছু ব্যবহারকারীর কুকি সেট করুন। (জাভাস্ক্রিপ্টের অনুরোধ করার আগে ব্যবহারকারী ইতিমধ্যে লগ ইন করে থাকতে পারে))
সার্ভারের পরবর্তী সমস্ত এপিআই অনুরোধে (জিইটি এবং জেএসএনপি অনুরোধগুলি সহ) সিএসআরএফ টোকেন, সিএসআরএফ বৈধতা কুকি এবং (লগ ইন থাকলে) ব্যবহারকারীর কুকি অন্তর্ভুক্ত থাকতে হবে। সার্ভারটি এখন অনুরোধটি বিশ্বাসযোগ্য কিনা তা নির্ধারণ করতে পারে:
বৈধ সিএসআরএফ টোকেনের উপস্থিতি নিশ্চিত করে যে কোনও ব্রাউজার দ্বারা লোড করা থাকলে , প্রত্যাশিত ডোমেন থেকে জাভাস্ক্রিপ্ট লোড হয়েছিল।
বৈধতা কুকি ছাড়াই সিএসআরএফ টোকেনের উপস্থিতি জালিয়াতি নির্দেশ করে।
সিএসআরএফ টোকেন এবং সিএসআরএফ বৈধতা কুকি উভয়ের উপস্থিতি কিছুই নিশ্চিত করে না: এটি হয় নকল সার্ভার সাইড অনুরোধ, বা ব্রাউজারের একটি বৈধ অনুরোধ হতে পারে। (এটি কোনও অসমর্থিত ডোমেন থেকে তৈরি ব্রাউজারের অনুরোধ হতে পারে না))
ব্যবহারকারীর কুকির উপস্থিতি নিশ্চিত করে যে ব্যবহারকারী লগইন করেছেন তবে ব্যবহারকারী প্রদত্ত অংশীদারের সদস্য কিনা তা নিশ্চিত করে না বা ব্যবহারকারী সঠিক ওয়েবসাইটটি দেখছে কিনা তাও নিশ্চিত করে না।
সিএসআরএফ বৈধতা কুকি ছাড়াই ব্যবহারকারীর কুকির উপস্থিতি জালিয়াতি নির্দেশ করে।
ব্যবহারকারীর কুকির উপস্থিতি ব্রাউজারের মাধ্যমে বর্তমান অনুরোধটি নিশ্চিত করেছে। (ধরে নিই যে কোনও ব্যবহারকারী কোনও অজানা ওয়েবসাইটে তাদের শংসাপত্রগুলি প্রবেশ করবে না এবং ধরে নিই যে আমরা কিছু সার্ভার সাইড অনুরোধ করার জন্য তাদের নিজস্ব শংসাপত্রগুলি ব্যবহারকারীর সম্পর্কে চিন্তা করি না)) যদি আমাদের কাছে সিএসআরএফ বৈধতা কুকিও থাকে তবে সেই সিএসআরএফ বৈধতা কুকি ছিল এছাড়াও একটি ব্রাউজার ব্যবহার করে প্রাপ্ত। পরবর্তী, যদি আমাদের কাছে বৈধ স্বাক্ষর সহ একটি সিএসআরএফ টোকেনও থাকে এবংসিএসআরএফ বৈধতা কুকির এলোমেলো নম্বরটি সেই সিএসআরএফ টোকেনের সাথে মিলে যায়, তারপরে সেই টোকনের জাভাস্ক্রিপ্টও পাওয়া গিয়েছিল সেই একই অনুরোধের সময় সিএসআরএফ কুকি সেট করা হয়েছিল, তাই ব্রাউজার ব্যবহার করেও। এরপরে এটিও বোঝায় যে টোকন সেট হওয়ার আগে উপরের জাভাস্ক্রিপ্ট কোডটি কার্যকর করা হয়েছিল এবং সেই সময় প্রদত্ত এপিআই কীটির জন্য ডোমেনটি বৈধ ছিল।
সুতরাং: সার্ভারটি এখন স্বাক্ষরযুক্ত টোকেন থেকে API কীটি নিরাপদে ব্যবহার করতে পারে।
যদি কোনও মুহুর্তে সার্ভারটি অনুরোধের উপর বিশ্বাস না করে তবে একটি 403 নিষিদ্ধ ফিরিয়ে দেওয়া হয়। উইজেট ব্যবহারকারীকে সতর্কতা দেখিয়ে তাতে সাড়া দিতে পারে।
এটি সিএসআরএফ বৈধতা কুকিতে স্বাক্ষর করার দরকার নেই, কারণ আমরা এটি স্বাক্ষরিত সিএসআরএফ টোকনের সাথে তুলনা করছি। কুকিতে স্বাক্ষর না করা প্রতিটি HTTP অনুরোধকে ছোট করে তোলে এবং সার্ভারের বৈধতাটি আরও দ্রুত।
উত্পন্ন সিএসআরএফ টোকন অনির্দিষ্টকালের জন্য বৈধ, তবে কেবলমাত্র বৈধতা কুকির সাথে একত্রে কার্যকরভাবে ব্রাউজারটি বন্ধ না হওয়া পর্যন্ত কার্যকরভাবে কার্যকর।
আমরা টোকেনের স্বাক্ষরের আজীবন সীমাবদ্ধ করতে পারি। ওডাব্লুএএসপি সুপারিশটি পূরণ করতে যখন ব্যবহারকারী লগ আউট করে তখন আমরা সিএসআরএফ বৈধতা কুকি মুছতে পারি । এবং একাধিক অংশীদারদের মধ্যে প্রতি ব্যবহারকারীর এলোমেলো নম্বর ভাগ করে না নেওয়ার জন্য, কেউই কুকি নামের এপিআই কী যুক্ত করতে পারে। তবে তারপরেও কেউ নতুন টোকেনের অনুরোধ করা হলে সহজেই সিএসআরএফ বৈধতা কুকিকে রিফ্রেশ করতে পারে না, কারণ ব্যবহারকারীরা একই সাইটটি একাধিক উইন্ডোতে ব্রাউজ করছেন, একটি কুকি ভাগ করে নিচ্ছেন (যা রিফ্রেশ করার পরে সমস্ত উইন্ডোতে আপডেট হবে) অন্যান্য উইন্ডোতে জাভাস্ক্রিপ্ট টোকেন আর সেই একক কুকির সাথে মেলে না)।
যারা ওআউথ ব্যবহার করেন তাদের জন্য ওআউথ এবং ক্লায়েন্ট-সাইড উইজেটগুলি দেখুন , যা থেকে আমি জাভাস্ক্রিপ্ট ধারণা পেয়েছি। জন্য সার্ভার প্রান্তের এপিআই, যা আমরা ডোমেইন সীমিত করতে জাভাস্ক্রিপ্ট কোড নির্ভর করতে পারে ব্যবহার, আমরা জনগণের API কীগুলির পরিবর্তে গোপন চাবি ব্যবহার করছেন।