क्रॉकफोर्ड के निजी या निजीकृत पैटर्न का पालन करने वाला कोई भी उपाय करें । उदाहरण के लिए:
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
विधियों और फ़ील्ड (पर्ल शैली) को रेखांकित करने के लिए अग्रणी अंडरस्कोर का उपयोग करता हूं , लेकिन जावास्क्रिप्ट में गोपनीयता रखने के विचार से पता चलता है कि यह कैसे गलत भाषा है।
इसलिए मैं क्रॉकफोर्ड के साथ उनके पहले वाक्य को छोड़कर असहमत हूं ।
तो जेएस में आपको वास्तविक गोपनीयता कैसे मिलती है? सर्वर साइड पर निजी होने के लिए वह सब कुछ रखें और AJAX कॉल करने के लिए JS का उपयोग करें।