Pegue qualquer uma das soluções que seguem o padrão privado ou privilegiado de Crockford . Por exemplo:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
Nos casos em que o invasor não tem direito de "execução" no contexto JS, ele não tem como acessar campos ou métodos "públicos" ou "privados". Caso o invasor tenha esse acesso, ele pode executar este procedimento:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Observe que o código acima é genérico para toda a privacidade do tipo construtor. Falhará com algumas das soluções aqui, mas deve ficar claro que praticamente todas as soluções baseadas em fechamento podem ser quebradas dessa maneira com replace()
parâmetros diferentes .
Após isso ser executado, qualquer objeto criado new Foo()
terá um eval
método que pode ser chamado para retornar ou alterar valores ou métodos definidos no fechamento do construtor, por exemplo:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
O único problema que vejo com isso é que ele não funcionará nos casos em que há apenas uma instância e é criada no carregamento. Porém, não há razão para definir um protótipo e, nesse caso, o atacante pode simplesmente recriar o objeto em vez do construtor, desde que ele possua uma maneira de transmitir os mesmos parâmetros (por exemplo, eles são constantes ou calculados a partir dos valores disponíveis).
Na minha opinião, isso praticamente torna a solução de Crockford inútil. Como a "privacidade" é facilmente quebrada, as desvantagens de sua solução (legibilidade e manutenção reduzidas, desempenho reduzido, aumento de memória) tornam o método baseado em protótipo "sem privacidade" a melhor escolha.
Eu costumo usar sublinhados principais para marcar __private
e _protected
métodos e campos (estilo Perl), mas a idéia de ter privacidade em JavaScript mostra apenas como é uma linguagem incompreendida.
Portanto, eu discordo de Crockford, exceto por sua primeira frase.
Então, como você obtém privacidade real em JS? Coloque tudo o que é necessário para ser privado no lado do servidor e use o JS para fazer chamadas AJAX.