আমি কীভাবে REST এপিআই কলগুলি সুরক্ষিত করব?


92

আমি বিশ্রামের ওয়েব অ্যাপ্লিকেশন বিকাশ করছি যা ব্যাকএন্ডে কিছু জনপ্রিয় ওয়েব কাঠামো ব্যবহার করে বলুন (রেল, সিনট্রা, ফ্লাস্ক, এক্সপ্রেস.জেএস)। আদর্শভাবে, আমি ব্যাকবোন.জেএস এর সাথে ক্লায়েন্টের দিকটি বিকাশ করতে চাই। আমি কীভাবে কেবল আমার জাভাস্ক্রিপ্ট ক্লায়েন্ট পক্ষকে সেই API কলগুলির সাথে ইন্টারেক্ট করতে দিই? আমি চাই না যে এই এপিআই কলগুলি সর্বজনীন হোক এবং curlকেবল বা ব্রাউজারে লিঙ্কটি প্রবেশ করে কল করা হোক ।


আপনার সমস্ত API কলগুলিতে আপনার পৃষ্ঠাটি পরিবেশন করার সময় ক্লায়েন্টকে দেওয়া এমন একটি টোকেনের দরকার আছে?
হাজপুজ


অ্যামাজন এডাব্লুএস জাভাস্ক্রিপ্ট এসডিকে প্রাক স্বাক্ষরিত অবজেক্ট ইউআরএল ব্যবহার করে: - ডকস.ওএস.আমাজোন.com
আমাজোনএস 3

উত্তর:


91

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

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

  • আমি নিশ্চিত, আপনার এপিআইয়ের কিছু প্রকারের প্রমাণীকরণ ক্ষেত্র রয়েছে (যেমন ক্লায়েন্টের উপর হ্যাশ গণনা করা)। যদি তা না হয় তবে এই এই প্রশ্নটি একবার দেখুনসেশন ভিত্তিতে আপনার জেএস ক্লায়েন্টকে দেওয়া একটি লবণ (বা এমনকি এপিআই কী) ব্যবহার করেছেন তা নিশ্চিত করুন । এইভাবে, আপনার API এর একটি অননুমোদিত ভোক্তা আরও অনেক বেশি কাজের জন্য বাধ্য is

  • জেএস ক্লায়েন্ট লোড করার সময়, কিছু এইচটিটিপি শিরোনাম (ব্যবহারকারী এজেন্ট মাথায় আসে) এবং আইপি ঠিকানা মনে রাখবেন এবং সাধারণ সন্দেহভাজনদের জন্য ব্ল্যাকলিস্ট নিয়োগ করে যদি তারা পরিবর্তন করেন তবে পুনরায় প্রমাণীকরণের জন্য জিজ্ঞাসা করুন। এটি কোনও আক্রমণকারীকে তার বাড়ির কাজটি আরও ভালভাবে করতে আরও বাধ্য করে।

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

আমি এটি প্রয়োজনীয় স্পষ্টতার সাথে বলতে পারি নি: আমি আপনার পরিষেবাটি গ্রাসকারীকে গ্রহণ করা একেবারেই অসম্ভব বলে মনে করি , তবে আপনি এটিকে এত কঠিন করে তুলতে পারেন, এটি ঝামেলার পক্ষে নাও হতে পারে।


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

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

কীভাবে অ্যাপ্লিকেশন হিসাবে প্রক্সি হিসাবে না করা যায় সে সম্পর্কে আপনি আরও ব্যাখ্যা করতে পারেন
পিরামিড

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

4
@ পাইরেট অ্যাপ একজন আক্রমণকারী সহজেই কেবল সিএসআরএফ শিরোনাম উপেক্ষা করতে পারে। এগুলি কেবলমাত্র কাজ করে, যদি শেষ ডিভাইসটি কোনও অপ্রকাশিত ব্রাউজার হয়
ইউজেন রিয়েক

12

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

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

তারপরে এটি আপনার আরএসটি ফ্রেমওয়ার্কে সেশনটির জন্য একটি চেক যুক্ত করা এবং একটি ব্যতিক্রম ছুঁড়ে ফেলার বিষয়। যদি সম্ভব হয় তবে স্থিতি কোডটি (বিশ্রামের জন্য) একটি 401 ত্রুটি হবে।


8
যদিও তাদের শিরোনামগুলির দিকে নজর দেওয়া এবং তাদের পুনরুত্পাদন করা থেকে বিরত কিছু নেই।
সিডিএমকেএ

4
@ সিডিএমকেএ - একটি টোকেনকে একটি সেশনে সংরক্ষিত টোকেনের সাথে মিল রাখতে হবে। কেবল শিরোনামটিকে পুনরায় উত্পাদন করার ফলে যদি এটি কোনও আলাদা সেশন থেকে আসে তবে "অননুমোদিত" প্রতিক্রিয়া দেখাবে।
আন্দ্রে ভলগিন

4
তারা এখনও একই অধিবেশন ব্যবহার এবং অনুরোধ পরিবর্তন আগে তারা এপিআই যদিও ... বা এমনকি রানটাইম এ কনসোল শুধুমাত্র অংশের আপনার যা দরকার পরিবর্তন মিলে হেডার / ক্ষেত্রের সাথে একটি কল জেনারেট ব্যবহার ... পাঠানো হয় পারেন
পটার Rafed

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

@ আন্ড্রেইলগিন হ্যাঁ যথেষ্ট ন্যায্য, তবে এটি এখনও একটি দুর্বলতা
পটার র‌্যাফ

9

এখন "জেএসএন ওয়েব টোকেন" নামে একটি মুক্ত স্ট্যান্ডার্ড রয়েছে,

দেখতে https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token

জেএসএন ওয়েব টোকেন (জেডব্লিউটি) টোকেন তৈরির জন্য একটি JSON- ভিত্তিক উন্মুক্ত মান (আরএফসি 7519) যা কিছু দাবি দাবি করে। উদাহরণস্বরূপ, একটি সার্ভার একটি টোকেন তৈরি করতে পারে যার দাবি "অ্যাডমিন হিসাবে লগ ইন হয়েছে" এবং এটি ক্লায়েন্টকে সরবরাহ করতে পারে। ক্লায়েন্ট তারপরে সেই টোকেনটি ব্যবহার করে প্রমাণ করতে পারে যে তারা প্রশাসক হিসাবে লগ ইন করেছেন। টোকেনগুলি সার্ভারের কী দ্বারা স্বাক্ষরিত হয়েছে, তাই সার্ভারটি টোকেনটি বৈধ কিনা তা যাচাই করতে সক্ষম হয়। টোকেনগুলি কমপ্যাক্ট, URL- সুরক্ষিত এবং বিশেষত ওয়েব ব্রাউজারের একক সাইন-অন (এসএসও) প্রসঙ্গে নকশাকৃত। জেডব্লিউটি দাবী সাধারণত পরিচয় প্রদানকারী এবং পরিষেবা সরবরাহকারী বা ব্যবসায়িক প্রক্রিয়াগুলির দ্বারা প্রয়োজনীয় অন্য কোনও ধরণের দাবিগুলির মধ্যে প্রমাণীকরণকারী ব্যবহারকারীদের পরিচয় পাস করার জন্য ব্যবহার করা যেতে পারে [[1] [২] টোকেনগুলি প্রমাণীকরণ এবং এনক্রিপ্টও করা যায় [[3] [4]


কোন ব্যবহারকারীকে তাদের টোকেন অনুলিপি করা এবং এটি অন্য কোনও প্রতিক্রিয়াতে ব্যবহার করতে বাধা দেবে?
উলাদ কাসাচ

4
@UladKasach সৎ আমি কখনোই তাদের গভীরে সত্যিই গিয়েছিলাম হতে, কিন্তু তারা expireable, অনন্য আমি যতদূর জানি আপনার ব্যবহারকারী জন্য, এবং SSL (যা আপনি অবশ্যই রক্ষার করছি) দ্বারা এনক্রিপ্ট, এটা OAuth পিছনে সঠিক একই ধারণা আমি যতদূর জানি এর
bbozo

3

আমাকে ক্ষমা করুন @ মার্কআমেরি এবং ইউজিন, তবে এটি ভুল।

ব্রাউজারে চলমান আপনার জেএস + এইচটিএমএল (ক্লায়েন্ট) অ্যাপ্লিকেশনটিকে API এ অননুমোদিত প্রত্যক্ষ কলগুলি বাদ দিতে সেট আপ করা যেতে পারে :

  1. প্রথম পদক্ষেপ: প্রমাণীকরণের জন্য API সেট আপ করুন। ক্লায়েন্ট প্রথম সার্ভার (অথবা অন্য কোনো নিরাপত্তা সার্ভার) মাধ্যমে নিজেই এ প্রমাণীকৃত আবশ্যক উদাহরণস্বরূপ মানুষের ব্যবহারকারী জিজ্ঞাসা সঠিক পাসওয়ার্ডটি প্রদান।

প্রমাণীকরণের আগে এপিআই-তে কলগুলি গ্রহণ করা হয় না।

প্রমাণীকরণের সময় একটি "টোকেন" ফিরে আসে।

প্রমাণীকরণের পরে "টোকেন" প্রমাণীকরণের সাথে শুধুমাত্র এপিআই কলগুলি গ্রহণ করা হবে।

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

  1. দ্বিতীয় পদক্ষেপ: এখন ক্লায়েন্ট জেএস + এইচটিএমএল অ্যাপ্লিকেশনটিকে সার্ভার থেকে অনুরোধ করার পরে একটি অতিরিক্ত সুরক্ষা API সেট করুন, এটি একটি স্বল্প সময়ের মধ্যেই কল করা উচিত। এই "কলব্যাক" সার্ভারকে বলবে যে ক্লায়েন্টটি সফলভাবে ডাউনলোড হয়েছিল। ক্লায়েন্টকে সম্প্রতি এবং সফলভাবে অনুরোধ করা হলে কেবলমাত্র আপনার আরএসপি এপিআই কলগুলিকে কাজ করতে সীমাবদ্ধ করুন।

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

সুতরাং আপনাকে চিন্তার দরকার নেই যে এটি শংসাপত্র ছাড়াই অননুমোদিত ব্যবহারকারী হতে পারে।

(এই প্রশ্নটির শিরোনাম, 'আমি কীভাবে REST এপিআই কলগুলি সুরক্ষিত করব', এবং আপনি যা বলছেন তার বেশিরভাগ থেকে এটিই আপনার প্রধান উদ্বেগ, এবং আপনার এপিআইকে কীভাবে আক্ষরিক প্রশ্ন বলা হয় তা নয়, বরং কার দ্বারা, সঠিক? )


4
দ্বিতীয় বিষয়টি কোনও অর্থহীন নয়। যদি কোনও আক্রমণকারীর আপনার অ্যাপ্লিকেশনটি লোড করা দরকার হয় তবে তিনি তা করবেন (আপনার কলব্যাক দৃশ্যমান)। এবং তারপর আক্রমণ।
আন্দ্রে ভলগিন

পয়েন্ট 2 পয়েন্ট 1 এর পাশাপাশি রয়েছে The আক্রমণকারীটির এখনও প্রমাণীকরণের প্রয়োজন। পয়েন্ট 2 কেবলমাত্র এতে যুক্ত হয়েছে যে অনুমোদিত হওয়ার জন্য আসলে এইচটিএমএল অ্যাপটি ডাউনলোড করতে হবে download সুতরাং অ্যাপ্লিকেশন ছাড়াই সরাসরি এপিআইগুলিতে একটি কল (সম্ভবত প্রমাণীকরণের পরে অ্যাক্সেস করা হয়েছে এবং ডাউনলোড করা) অসম্ভব। কোনটি যা এই প্রশ্নে অনুরোধ করা হয়েছিল।

আপনি কেবলমাত্র আপনার ডোমেন থেকে অনুরোধগুলি অনুমতি দিতে পারবেন।
আন্দ্রে ভলগিন

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

4
আপনি যা উপেক্ষা করছেন বলে মনে হয় তা হ'ল, আপনি আপনার ব্যবহারকারীর ব্রাউজারটিকে যা করতে বলবেন, কোনও আক্রমণকারী দ্বারা প্রতিলিপি তৈরি করা যেতে পারে - ব্রাউজারটি এটি করার জন্য এটি অবশ্যই পঠনযোগ্য।
ইউজেন রিয়েক

1
  1. ক্লায়েন্টটি প্রথমে আপনার index.html(বা backbone.jsইত্যাদি) লোড করার পরে সার্ভারে একটি SESSION ভার সেট করুন

  2. প্রতিটি API কলের সার্ভার-সাইডে এই ভেরিটি পরীক্ষা করুন।

পিএস এটি কোনও "সুরক্ষা" সমাধান নয় !!! এটি কেবলমাত্র আপনার সার্ভারের বোঝাটি সহজ করার জন্য যাতে লোকেরা এটির অপব্যবহার না করে বা অন্য ওয়েবসাইট এবং অ্যাপ্লিকেশনগুলি থেকে আপনার এপিআই "হটলিঙ্ক" না করে।


0

আমি যা করি তা এখানে:

  1. এক্স-এপিটোকেনের মতো কলগুলির সাথে এইচটিপি শিরোনামের সাহায্যে API টি সুরক্ষিত করুন:

  2. পিএইচপি-তে সেশন ভেরিয়েবলগুলি ব্যবহার করুন। জায়গায় লগইন সিস্টেম রাখুন এবং সেশন ভেরিয়েবলগুলিতে ব্যবহারকারী টোকেন সংরক্ষণ করুন।

  3. জেএস কোডটি আজাক্সের সাথে পিএইচপিতে কল করুন এবং এপিআইতে কল করতে কার্ল সহ সেশন ভেরিয়েবলটি ব্যবহার করুন। এইভাবে, সেশন ভেরিয়েবলটি সেট না করা থাকলে, এটি কল করবে না এবং পিএইচপি কোডটিতে API- এ অ্যাক্সেস টোকন রয়েছে।

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