ব্যক্তিগত পদ্ধতি কি আসলেই নিরাপদ?


92

জাভাতে privateঅ্যাক্সেস মডিফায়ারটি ক্লাসের বাইরে দৃশ্যমান না হওয়ায় এটি নিরাপদ হিসাবে বিবেচনা করে। তারপরে বাইরের বিশ্বও সেই পদ্ধতি সম্পর্কে জানে না।

তবে আমি ভেবেছিলাম জাভা প্রতিবিম্ব এই নিয়মটি ভাঙ্গতে ব্যবহার করতে পারে। নিম্নলিখিত ক্ষেত্রে বিবেচনা করুন:

public class ProtectedPrivacy{

  private String getInfo(){
     return "confidential"; 
  }

}  

এখন অন্য একটি ক্লাস থেকে আমি তথ্য পেতে যাচ্ছি:

public class BreakPrivacy{

   public static void main(String[] args) throws Exception {
       ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
       Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
       method.setAccessible(true);
       Object result = method.invoke(protectedPrivacy);
       System.out.println(result.toString());
   }
} 

এই মুহুর্তে আমি কেবল এখনও ব্যক্তিগত পদ্ধতিটি নিরাপদ বলে ভাবছি কারণ উপরের মতো কিছু করার জন্য আমাদের অবশ্যই পদ্ধতির নামটি জানতে হবে। তবে যে শ্রেণিতে প্রাইভেট পদ্ধতি রয়েছে সেগুলি যদি অন্য কারও দ্বারা লিখিত হয় তবে আমাদের সেগুলির দৃশ্যমানতা নেই।

তবে কোডটি নীচের লাইন থেকে আমার বিষয়টি অবৈধ হয়ে গেছে।

Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();

এখন method[]এটিতে উপরের জিনিসটি করা দরকার contains আমার প্রশ্ন হ'ল, জাভা প্রতিবিম্ব ব্যবহার করে এই ধরণের জিনিস এড়ানো কোনও উপায় আছে কি?

আমি আমার প্রশ্নটি পরিষ্কার করার জন্য জাভা ডকুমেন্টেশন থেকে কিছু পয়েন্ট উদ্ধৃত করছি ।

অ্যাক্সেস স্তর চয়ন করার বিষয়ে টিপস:

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


4
একটি অবলম্বনকারী ব্যবহার করা সাহায্য করতে পারে, কারণ getDeclaredMethodsআবর্জনার মতো দেখতে এমন নামগুলি ফিরে আসবে।
সের্গেই কালিনিচেনকো

213
ব্যক্তিগত, সুরক্ষিত পাবলিক ইত্যাদি সুরক্ষার জন্য নয়, এটি লোকেদের ভুল করা থেকে বিরত রাখা। এটি সুরক্ষা ব্যবস্থা হিসাবে ব্যবহার করবেন না
রিচার্ড টিঙ্গল

20
জাভা কোড যেভাবেই নিষ্প্রভযোগ্য। একজন 'আক্রমণকারী' কেবল একটি জাভা ডিকম্পিলার ডাউনলোড করতে এবং আপনার কোড পড়তে বা 'ব্যক্তিগত' পরিবর্তন করে 'পাবলিক' করতে পারে।
11684

7
@ রিচার্ডটিঙ্গলের মন্তব্য (+1 বিটিডাব্লু) কী করেছে তা বিস্তারিতভাবে জানাতে। সুরক্ষা এবং সুরক্ষার মধ্যে একটি দুর্দান্ত এবং গুরুত্বপূর্ণ পার্থক্য রয়েছে। যেখানে পরবর্তী সমস্যাটি অ্যাক্সেস মডিফায়ারগুলির সাথে প্রশমিত হয়; দুর্ঘটনাক্রমে
ব্যবহারকারী

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

উত্তর:


95

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

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


4
স্পর্শকাতর, আমি জানি, তবে আরও নিয়ন্ত্রিত ব্যবস্থাপক এই অর্থে কী হতে পারেন সে সম্পর্কে আপনি কিছুটা ব্যাখ্যা করতে পারেন?
ধূসর

12
@ গ্রে: সিকিউরিটি ম্যানেজারের একটি উদাহরণ যা check*মূলত প্রাসঙ্গিক কলগুলিতে ব্যতিক্রম ছুঁড়ে দেয় ।
জন স্কিটি

40

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

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

অ্যাক্সেস modifers একটি সহজ ফ্রেজ সংকলিত আপ যাবে না "TMI, শহরবাসী, আমি তাই যে জানা প্রয়োজন করা হয়নি"।


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

7

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


6

প্রশ্নটি হ'ল আপনি এ থেকে কে বাঁচানোর চেষ্টা করছেন । আমার মতে, আপনার কোডের এ জাতীয় ক্লায়েন্ট হ'ল ক্ষতি এখানে।

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


5

সুবিধাসহ, দায়িত্ব আসে। এমন কিছু আছে যা আপনি করতে পারবেন না এবং আপনি যা করতে পারেন তা করতে কিন্তু আপনার করা উচিত নয়

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


5

আপনার এপিআই-র ক্লায়েন্ট প্রোগ্রামারকে আপনি বিশ্বাস করে ধরে নিচ্ছেন, দেখার আরও একটি উপায় হ'ল particular নির্দিষ্ট ফাংশনগুলি ব্যবহার করা তাদের পক্ষে কতটা 'নিরাপদ'।

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

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


5

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

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

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

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