Mengambil salah satu solusi yang mengikuti Crockford pribadi atau priviledged pola. Sebagai contoh:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
Dalam setiap kasus di mana penyerang tidak memiliki hak "mengeksekusi" pada konteks JS ia tidak memiliki cara untuk mengakses bidang atau metode "publik" atau "pribadi". Seandainya penyerang memiliki akses tersebut, ia dapat menjalankan one-liner ini:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Perhatikan bahwa kode di atas adalah generik untuk semua privasi tipe konstruktor. Ini akan gagal dengan beberapa solusi di sini tetapi harus jelas bahwa hampir semua solusi berbasis penutupan dapat dipecah seperti ini dengan replace()
parameter yang berbeda .
Setelah ini dieksekusi objek apa pun yang dibuat dengan new Foo()
akan memiliki eval
metode yang dapat dipanggil untuk mengembalikan atau mengubah nilai atau metode yang didefinisikan dalam penutupan konstruktor, misalnya:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
Satu-satunya masalah yang saya dapat lihat dengan ini bahwa itu tidak akan berfungsi untuk kasus-kasus di mana hanya ada satu contoh dan itu dibuat saat dimuat. Tetapi kemudian tidak ada alasan untuk benar-benar mendefinisikan prototipe dan dalam hal ini penyerang dapat dengan mudah menciptakan kembali objek alih-alih konstruktor selama ia memiliki cara untuk melewatkan parameter yang sama (misalnya mereka konstan atau dihitung dari nilai yang tersedia).
Menurut pendapat saya, ini cukup banyak membuat solusi Crockford tidak berguna.Karena "privasi" dengan mudah merusak kelemahan dari solusinya (mengurangi keterbacaan & pemeliharaan, penurunan kinerja, peningkatan memori) menjadikan metode berbasis prototipe "tidak privasi" menjadi pilihan yang lebih baik.
Saya biasanya menggunakan garis bawah terkemuka untuk menandai __private
dan _protected
metode dan bidang (gaya Perl), tetapi gagasan memiliki privasi dalam JavaScript hanya menunjukkan bagaimana itu adalah bahasa yang disalahpahami.
Karena itu saya tidak setuju dengan Crockford kecuali untuk kalimat pertamanya.
Jadi, bagaimana Anda mendapatkan privasi nyata di JS? Masukkan semua yang diperlukan untuk menjadi pribadi di sisi server dan gunakan JS untuk melakukan panggilan AJAX.