ใช้ใด ๆ ของการแก้ปัญหาที่เป็นไปตาม Crockford ของส่วนตัวหรือpriviledgedรูปแบบ ตัวอย่างเช่น:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
ในกรณีใด ๆ ที่ผู้โจมตีไม่มี "ดำเนินการ" ที่ถูกต้องในบริบท JS เขาไม่สามารถเข้าถึงช่องหรือวิธีการ "สาธารณะ" หรือ "ส่วนตัว" ใด ๆ ในกรณีที่ผู้โจมตีมีการเข้าถึงนั้นเขาสามารถดำเนินการแบบหนึ่งซับ:
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");
ปัญหาเดียวที่ฉันเห็นด้วยนี้ไม่สามารถใช้งานได้ในกรณีที่มีเพียงหนึ่งอินสแตนซ์และสร้างขึ้นเมื่อโหลด แต่ก็ไม่มีเหตุผลใดที่จะกำหนดต้นแบบจริงและในกรณีนั้นผู้โจมตีสามารถสร้างวัตถุขึ้นมาใหม่แทนที่จะเป็นตัวสร้างตราบใดที่เขามีวิธีผ่านพารามิเตอร์เดียวกัน (เช่นมีค่าคงที่หรือคำนวณจากค่าที่มี)
ในความคิดของฉันนี้สวยมากทำให้การแก้ปัญหาของ Crockford ไร้ประโยชน์ เนื่องจาก "ความเป็นส่วนตัว" เสียง่ายข้อเสียของโซลูชันของเขา (ลดความสามารถในการอ่านและการบำรุงรักษาประสิทธิภาพที่ลดลงหน่วยความจำเพิ่มขึ้น) ทำให้วิธีการแบบ "ไม่มีความเป็นส่วนตัว" เป็นตัวเลือกที่ดีกว่า
ฉันมักจะใช้ขีดเส้นใต้ชั้นนำในการทำเครื่องหมาย__private
และ_protected
วิธีการและสาขา (สไตล์ Perl) แต่ความคิดของการมีความเป็นส่วนตัวใน JavaScript เพียงแสดงให้เห็นว่ามันเป็นภาษาที่เข้าใจผิด
ดังนั้นฉันไม่เห็นด้วยกับCrockfordยกเว้นประโยคแรกของเขา
ดังนั้นคุณจะได้รับความเป็นส่วนตัวอย่างแท้จริงใน JS ได้อย่างไร วางทุกอย่างที่จำเป็นต้องเป็นส่วนตัวทางฝั่งเซิร์ฟเวอร์และใช้ JS เพื่อทำการโทร AJAX