একটি "কখনও কখনও অফলাইন" ওয়েব অ্যাপ্লিকেশনে ব্যবহারের জন্য অনন্য এবং সুরক্ষিত শনাক্তকারী তৈরির কৌশল


47

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

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

নীচে আমার প্রস্তাবিত সমাধান।

কিছু প্রয়োজনীয়তা

  1. আইডিগুলি বিশ্বব্যাপী অনন্য হওয়া উচিত (বা সিস্টেমের মধ্যে অন্তত অনন্য)
  2. ক্লায়েন্টে উত্পন্ন (যেমন ব্রাউজারে জাভাস্ক্রিপ্টের মাধ্যমে)
  3. সুরক্ষিত (উপরে বর্ণিত হিসাবে এবং অন্যথায়)
  4. ডেটা একাধিক ব্যবহারকারীর দ্বারা দেখা / সম্পাদনা করা যেতে পারে, যার দ্বারা এটি লেখেননি
  5. ব্যাকএন্ড ডিবি'র (যেমন মঙ্গোডিবি বা কাউচডিবি) এর জন্য উল্লেখযোগ্য পারফরম্যান্সের সমস্যা সৃষ্টি করে না

প্রস্তাবিত সমাধান

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

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

  1. এটি একটি "সন্নিবেশ" ক্রিয়া হিসাবে চিহ্নিত করুন (যেমন কোনও আপডেট বা মুছা নয়)
  2. যৌগিক কী উভয় অংশ বৈধ uuids বৈধ করুন
  3. বৈঠক করুন যে সম্মিলিত আইডির প্রদত্ত "আইডি টোকেন" অংশটি বর্তমান ব্যবহারকারীর জন্য সঠিক (উদাহরণস্বরূপ এটি যখন তারা তাদের অ্যাকাউন্ট তৈরি করবেন তখন ব্যবহারকারীকে নির্ধারিত সার্ভারের সাথে আইডি টোকেনের সাথে মেলে)
  4. যদি সবকিছু ডিবি মধ্যে copasetic, ডাটা সন্নিবেশ আছে (সাবধান হচ্ছে একটি সন্নিবেশ এবং একটি "upsert" কি তাই যে যদি আইডি আছে আগে থেকেই আছে এটা ভুল করে একটি বিদ্যমান রেকর্ড আপডেট করে না)

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

এই পদ্ধতির সুবিধা কি কি?

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

  2. আইডিএসকে একটি ক্লায়েন্ট উত্পাদিত মান এবং একটি সার্ভার উত্পন্ন মানের সংমিশ্রণ তৈরি করে প্রতিটি ব্যবহারকারী কার্যকরভাবে একটি স্যান্ডবক্সে আইডি তৈরি করে। এটি দূষিত / দুর্বৃত্ত ক্লায়েন্ট দ্বারা যে ক্ষয়টি করা যেতে পারে তা সীমাবদ্ধ করার উদ্দেশ্যে। এছাড়াও, কোনও আইডি সংঘর্ষগুলি প্রতিটি ব্যবহারকারী ভিত্তিতে হয়, পুরো সিস্টেমে বৈশ্বিক নয়।

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

উদ্বেগ

এই পদ্ধতির সাথে আমার কিছু উদ্বেগ এখানে

  1. এটি কি বড় আকারের অ্যাপ্লিকেশনটির জন্য পর্যাপ্ত অনন্য আইডি তৈরি করবে? এর ফলে আইডি সংঘর্ষের ফলস্বরূপ ভাবার কোন কারণ আছে কি? জাভাস্ক্রিপ্ট এ কাজ করার জন্য পর্যাপ্ত পরিমাণে এলোমেলো ইউইড তৈরি করতে পারে? দেখে মনে হচ্ছে উইন্ডো। ক্রাইপ্টো মোটামুটিভাবে উপলব্ধ এবং এই প্রকল্পটির জন্য ইতিমধ্যে যুক্তিসঙ্গতভাবে আধুনিক ব্রাউজারগুলির প্রয়োজন। ( এই প্রশ্নের এখন নিজস্ব একটি পৃথক এসও প্রশ্ন রয়েছে )

  2. আমি কি এমন কোনও ফাঁক ফাঁস করছি যা একটি দূষিত ব্যবহারকারীকে সিস্টেমের সাথে আপোস করার অনুমতি দিতে পারে?

  3. 2 ইউইউডের সমন্বিত সমন্বিত কীটির জন্য অনুসন্ধান করার সময় ডিবি পারফরম্যান্স নিয়ে চিন্তার কারণ রয়েছে কি? সেরা পারফরম্যান্সের জন্য এই আইডিটি কীভাবে সংরক্ষণ করা উচিত? দুটি পৃথক ক্ষেত্র বা একটি একক অবজেক্ট? মঙ্গো বনাম পালঙ্কের জন্য কি আলাদা "সেরা" পদ্ধতির ব্যবস্থা থাকতে পারে? আমি জানি যে একটি অ-অনুক্রমিক প্রাথমিক কী থাকা সন্নিবেশগুলি করার সময় উল্লেখযোগ্য পারফরম্যান্স সমস্যার কারণ হতে পারে। প্রাথমিক কীটির জন্য একটি স্বয়ংক্রিয় উত্পাদিত মান থাকা এবং এই আইডিটিকে একটি পৃথক ক্ষেত্র হিসাবে সঞ্চয় করা কী চৌর্য হবে? ( এই প্রশ্নের এখন নিজস্ব একটি পৃথক এসও প্রশ্ন রয়েছে )

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

  5. যদি কোনও ব্যবহারকারীর জন্য আইডি সংঘর্ষ হয় তবে পুনরুদ্ধার করার সহজ উপায় নেই। আমি মনে করি ক্লায়েন্টটি একটি নতুন আইডি তৈরি করতে পারে, তবে এটি এমন একটি প্রান্তের ক্ষেত্রে প্রচুর কাজ বলে মনে হচ্ছে যা সত্যিই কখনও ঘটে না। আমি এই উদাসীন ছেড়ে যাওয়ার ইচ্ছা করছি।

  6. কেবলমাত্র অনুমোদিত ব্যবহারকারীগণই ডেটা দেখতে এবং / বা সম্পাদনা করতে পারবেন। এটি আমার সিস্টেমের জন্য একটি গ্রহণযোগ্য সীমাবদ্ধতা।

উপসংহার

একটি যুক্তিসঙ্গত পরিকল্পনা উপরে? আমি বুঝতে পারি যে এগুলির কিছুটি প্রশ্নের মধ্যে থাকা অ্যাপ্লিকেশনটির সম্পূর্ণ বোঝার উপর ভিত্তি করে রায় সিদ্ধান্তে নেমে এসেছে।


আমি মনে করি এই প্রশ্নটি আপনাকে স্ট্যাকওভারফ্লো. com/Qestions/105034/… নিয়ে ভাবতে পারে তবে এটি আমার কাছে জিআইডির মতো পড়েছে তবে তারা জাভাস্ক্রিপ্টে নেটিভ বলে মনে হয় না
রমি

2
এটি আমাকে আঘাত করে যে ইউইউডিগুলি ইতিমধ্যে 5 টি তালিকাভুক্ত প্রয়োজনীয়তা পূরণ করে। কেন তারা অপর্যাপ্ত?
গাবে

@ গাবে নীচে মিথ্যা রায়ান পোস্টে আমার মন্তব্য দেখুন
হারব্র্যান্ডসন

এই প্রশ্নের মেটা আলোচনা: meta.stackoverflow.com/questions/251215/...
মশা

"দূষিত / রাউজ ক্লায়েন্ট" - দুর্বৃত্ত।
ডেভিড কনরাড

উত্তর:


4

আপনার পদ্ধতির কাজ করবে। প্রচুর নথি পরিচালনার সিস্টেমগুলি এই ধরণের পদ্ধতির ব্যবহার করে use

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

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


2
আমি আইডি হিসাবে 2 এর একটি হ্যাশ ব্যবহার করার বিষয়টি বিবেচনা করেছি। যাইহোক, এটি আমার কাছে উপস্থিত হয়নি যে সমস্ত ব্রাউজারগুলিতে আমাকে সমর্থন করা দরকার সেখানে একটি
শ 256

12

আপনার দুটি উদ্বেগ আলাদা করতে হবে:

  1. আইডি জেনারেশন: ক্লায়েন্ট অবশ্যই বিতরণ সিস্টেমে একটি অনন্য সনাক্তকারী তৈরি করতে সক্ষম হবে gene
  2. সুরক্ষা উদ্বেগ: ক্লায়েন্টের অবশ্যই বৈধ ব্যবহারকারীর প্রমাণীকরণ টোকেন থাকতে হবে এবং প্রমাণীকরণের টোকেনটি অবজেক্টটি তৈরি / পরিবর্তিত হওয়ার জন্য বৈধ

দুর্ভাগ্যক্রমে এই দুটির সমাধান পৃথক; তবে ভাগ্যক্রমে এগুলি বেমানান নয়।

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

সঠিকভাবে পরিচালনা করা হলে, সংঘর্ষটি সত্যই কোনও সুরক্ষা সমস্যা সৃষ্টি করবে না (ব্যবহারকারী বা ক্লায়েন্টকে কেবল অন্য ইউআইডি দিয়ে অপারেশনটি পুনরায় চেষ্টা করতে বলা হবে)।


এটি সত্যিই ভাল পয়েন্ট। সম্ভবত এটিই প্রয়োজনীয় এবং আমি এটিকে ওভারটিনিং করছি। তবে এই পদ্ধতির বিষয়ে আমার কয়েকটি উদ্বেগ রয়েছে। সবচেয়ে বড় যে জাভাস্ক্রিপ্ট উত্পন্ন UUID জানা এক শক্তি Hope (এ মন্তব্য দেখতে হিসাবে র্যান্ডম যেমন হবে বলে মনে হচ্ছে না stackoverflow.com/a/2117523/13181 আটক জন্য)। দেখে মনে হচ্ছে উইন্ডো। ক্রাইপ্টো এই সমস্যাটি সমাধান করা উচিত, তবে আমার সমর্থন করা দরকার এমন সমস্ত ব্রাউজার সংস্করণে এটি উপলব্ধ বলে মনে হচ্ছে না।
হারব্র্যান্ডসন

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

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

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

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ। এটা সত্যিই আমাকে আমার চিন্তাভাবনা পরিষ্কার করতে বাধ্য করেছে! আমি আপনার পদ্ধতির বিষয়ে সতর্ক থাকার একটি কারণ রয়েছে এবং আমি এটিকে রাস্তায় ভুলে গিয়েছিলাম :)। আমার ভয় অনেকগুলি ব্রাউজারে দরিদ্র আরএনজির সাথে জড়িত। ইউইডি প্রজন্মের জন্য, একজন ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী আরএনজি পছন্দ করবে। অনেক নতুন ব্রাউজারের উইন্ডো ক্রাইপ্টো এর মাধ্যমে এটি থাকে তবে পুরানো ব্রাউজারগুলি তা করে না। এর কারণে, কোনও দূষিত ব্যবহারকারীর পক্ষে অন্য ব্যবহারকারী আরএনজি-র বীজ বের করা সম্ভব হবে এবং এরপরে পরবর্তী ইউউইডটি জেনে নেওয়া হবে। এটি এমন অংশ যা অনুভব করে যে এটি আক্রমণ করা যেতে পারে।
হারব্র্যান্ডসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.