Tome cualquiera de las soluciones que siguen el patrón privado o privilegiado de Crockford . Por ejemplo:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
En cualquier caso en el que el atacante no tenga "ejecutar" directamente en el contexto JS, no tiene forma de acceder a ningún campo o método "público" o "privado". En caso de que el atacante tenga ese acceso, puede ejecutar esta línea:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Tenga en cuenta que el código anterior es genérico para todo constructor-type-privacy. Fallará con algunas de las soluciones aquí, pero debe quedar claro que casi todas las soluciones basadas en el cierre pueden romperse de esta manera con diferentesreplace()
parámetros.
Después de que esto se ejecute, cualquier objeto creado con new Foo()
tendrá un eval
método al que se puede llamar para devolver o cambiar valores o métodos definidos en el cierre del constructor, por ejemplo:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
El único problema que puedo ver con esto es que no funcionará en los casos en que solo haya una instancia y se cree en carga. Pero entonces no hay ninguna razón para definir realmente un prototipo y en ese caso el atacante puede simplemente recrear el objeto en lugar del constructor, siempre que tenga una forma de pasar los mismos parámetros (por ejemplo, son constantes o se calculan a partir de los valores disponibles).
En mi opinión, esto hace que la solución de Crockford sea inútil.Dado que la "privacidad" se rompe fácilmente, las desventajas de su solución (menor legibilidad y facilidad de mantenimiento, menor rendimiento, mayor memoria) hacen que el método basado en el prototipo "sin privacidad" sea la mejor opción.
Usualmente uso guiones bajos para marcar __private
y _protected
métodos y campos (estilo Perl), pero la idea de tener privacidad en JavaScript solo muestra cómo es un lenguaje incomprendido.
Por lo tanto, no estoy de acuerdo con Crockford excepto por su primera oración.
Entonces, ¿cómo se obtiene privacidad real en JS? Ponga todo lo que se requiere para ser privado en el lado del servidor y use JS para hacer llamadas AJAX.