Crockford'un özel veya ayrıcalıklı modelini takip eden çözümlerden herhangi birini alın . Örneğin:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
Saldırganın JS bağlamında "yürütme" hakkı olmadığı her durumda, "genel" veya "özel" alanlara veya yöntemlere erişme yolu yoktur. Saldırganın bu erişime sahip olması durumunda, bu tek astarı yürütebilir:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Yukarıdaki kodun tüm yapıcı türü-gizlilik için genel olduğunu unutmayın. Buradaki bazı çözümlerle başarısız olacaktır, ancak kapak tabanlı çözümlerin hemen hemen hepsinin farklı replace()
parametrelerle bu şekilde kırılabileceği açık olmalıdır .
Bu yürütüldükten sonra, ile oluşturulan herhangi bir nesne, kurucunun kapanışında tanımlanan değerleri veya yöntemleri döndürmek veya değiştirmek için çağrılabilecek new Foo()
bir eval
yönteme sahip olacaktır, örneğin:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
Bununla ilgili görebildiğim tek sorun, tek bir örneğin olduğu ve yükte oluşturulduğu durumlarda işe yaramayacağı. Ancak o zaman bir prototip tanımlamak için hiçbir neden yoktur ve bu durumda saldırgan, aynı parametreleri geçirmenin bir yolu olduğu sürece (örn. Sabit veya kullanılabilir değerlerden hesaplanır) yapıcı yerine nesneyi yeniden oluşturabilir.
Benim düşünceme göre, bu Crockford'un çözümünü neredeyse işe yaramaz hale getiriyor."Mahremiyet" çözümünün dezavantajları (azaltılmış okunabilirlik ve bakım kolaylığı, düşük performans, artan bellek) "gizlilik yok" prototip tabanlı yöntemi daha iyi bir seçim haline getirir.
Ben genellikle işaret __private
ve _protected
yöntemleri ve alanları (Perl tarzı) işaretlemek için önde gelen alt çizgiler kullanın, ancak JavaScript gizlilik fikri nasıl sadece yanlış anlaşılmış bir dil gösterir.
Bu yüzden ilk cümlesi dışında Crockford'a katılmıyorum .
Peki JS'de gerçek gizliliği nasıl elde edersiniz? Özel olması gereken her şeyi sunucu tarafına koyun ve AJAX aramaları yapmak için JS kullanın.