সমাধান যে Crockford এর অনুসরণ কোন নিন ব্যক্তিগত বা priviledged প্যাটার্ন। উদাহরণ স্বরূপ:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
যে কোনও ক্ষেত্রে হামলাকারীর জেএস প্রসঙ্গে সঠিকভাবে "মৃত্যুদন্ড কার্যকর করা" নেই তার কাছে কোনও "পাবলিক" বা "ব্যক্তিগত" ক্ষেত্র বা পদ্ধতিগুলি অ্যাক্সেস করার উপায় নেই। আক্রমণকারীটির যদি সেই অ্যাক্সেস থাকে তবে সে এই ওয়ান-লাইনারটি কার্যকর করতে পারে:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
নোট করুন যে উপরের কোডটি সমস্ত কনস্ট্রাক্টর-টাইপ-গোপনীয়তার জন্য জেনেরিক। এটি এখানে কিছু সমাধানের সাথে ব্যর্থ হবে তবে এটি পরিষ্কার হওয়া উচিত যে ক্লোজার ভিত্তিক সমাধানগুলি সমস্তরকম আলাদা করে এইভাবে ভেঙে যেতে পারেreplace()
পরামিতিগুলির ।
এটি কার্যকর হওয়ার পরে যা দিয়ে তৈরি কোনও অবজেক্টের new Foo()
এমন একটি eval
পদ্ধতি রয়েছে যা কনস্ট্রাক্টরের ক্লোজারে সংজ্ঞায়িত মান বা পদ্ধতিগুলি পরিবর্তন করতে বা পরিবর্তন করতে বলা যেতে পারে, যেমন:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
আমি কেবল এটিই দেখতে পাচ্ছি যে এটি কেবলমাত্র একটি উদাহরণ রয়েছে এবং এটি লোডে তৈরি হয়েছে এমন ক্ষেত্রে এটি কাজ করবে না। তবে তারপরে প্রকৃতপক্ষে প্রোটোটাইপ সংজ্ঞায়িত করার কোনও কারণ নেই এবং সেক্ষেত্রে আক্রমণকারী যতক্ষণ না তার একই পরামিতিগুলি পাস করার উপায় রাখে (যেমন এগুলি স্থির বা উপলব্ধ মান থেকে গণনা করা হয়) ততক্ষণ নির্ধারকের পরিবর্তে অবজেক্টটি পুনরায় তৈরি করতে পারে।
আমার মতে, এটি ক্রোকফোর্ডের সমাধানটিকে অকেজো করে তোলে।যেহেতু "গোপনীয়তা" সহজেই তার সমাধানের ডাউনসাইডগুলি ভেঙে যায় (হ্রাসযোগ্য পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা, কর্মক্ষমতা হ্রাস, মেমরি বৃদ্ধি) "কোনও গোপনীয়তা নয়" প্রোটোটাইপ ভিত্তিক পদ্ধতিটিকে আরও ভাল পছন্দ করে তোলে।
আমি সাধারণত চিহ্নিতকরণ __private
এবং _protected
পদ্ধতি এবং ক্ষেত্রগুলিতে (পার্ল শৈলী) শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করি তবে জাভাস্ক্রিপ্টে গোপনীয়তা রাখার ধারণাটি দেখায় যে এটি কীভাবে একটি ভুল বোঝানো ভাষা।
তাই আমি ক্রকফোর্ডের সাথে একমত নই তার প্রথম বাক্যটি বাদ ।
তাহলে আপনি কীভাবে জেএসে প্রকৃত গোপনীয়তা পাবেন? সার্ভার সাইডে প্রাইভেট হওয়ার জন্য প্রয়োজনীয় সমস্ত কিছু রাখুন এবং এজেএক্স কলগুলি করতে জেএস ব্যবহার করুন।