Thực hiện bất kỳ các giải pháp mà theo Crockford tin hoặc priviledged mẫu. Ví dụ:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
Trong mọi trường hợp kẻ tấn công không có quyền "thực thi" ngay trong bối cảnh JS, anh ta không có cách nào truy cập vào bất kỳ trường hoặc phương thức "công khai" hoặc "riêng tư" nào. Trong trường hợp kẻ tấn công có quyền truy cập đó, anh ta có thể thực hiện lệnh này:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Lưu ý rằng đoạn mã trên là chung cho tất cả các kiểu xây dựng-quyền riêng tư. Nó sẽ thất bại với một số giải pháp ở đây nhưng rõ ràng là khá nhiều tất cả các giải pháp dựa trên đóng có thể bị phá vỡ như thế này với các replace()
tham số khác nhau .
Sau khi điều này được thực thi, bất kỳ đối tượng nào được tạo new Foo()
sẽ có một eval
phương thức có thể được gọi để trả về hoặc thay đổi các giá trị hoặc phương thức được xác định trong bao đóng của hàm tạo, ví dụ:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
Vấn đề duy nhất tôi có thể thấy với điều này là nó sẽ không hoạt động trong trường hợp chỉ có một phiên bản và nó được tạo khi tải. Nhưng sau đó, không có lý do gì để thực sự xác định một nguyên mẫu và trong trường hợp đó, kẻ tấn công có thể chỉ cần tạo lại đối tượng thay vì hàm tạo miễn là anh ta có cách truyền các tham số giống nhau (ví dụ: chúng là hằng số hoặc được tính từ các giá trị khả dụng).
Theo tôi, điều này khá nhiều làm cho giải pháp của Crockford trở nên vô dụng.Vì "quyền riêng tư" dễ dàng bị phá vỡ nhược điểm của giải pháp của anh ấy (giảm khả năng đọc và bảo trì, giảm hiệu suất, tăng bộ nhớ) làm cho phương pháp dựa trên nguyên mẫu "không riêng tư" trở thành lựa chọn tốt hơn.
Tôi thường sử dụng dấu gạch dưới hàng đầu để đánh dấu __private
và _protected
các phương thức và trường (kiểu Perl), nhưng ý tưởng về quyền riêng tư trong JavaScript chỉ cho thấy đó là ngôn ngữ bị hiểu sai như thế nào.
Vì vậy, tôi không đồng ý với Crockford ngoại trừ câu đầu tiên của anh ấy.
Vậy làm thế nào để bạn có được sự riêng tư thực sự trong JS? Đặt mọi thứ bắt buộc phải riêng tư ở phía máy chủ và sử dụng JS để thực hiện các cuộc gọi AJAX.