Nehmen Sie eine der Lösungen, die Crockfords privatem oder privilegiertem Muster folgen . Zum Beispiel:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
In jedem Fall, in dem der Angreifer kein "Ausführungsrecht" im JS-Kontext hat, hat er keine Möglichkeit, auf "öffentliche" oder "private" Felder oder Methoden zuzugreifen. Falls der Angreifer diesen Zugriff hat, kann er diesen Einzeiler ausführen:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Beachten Sie, dass der obige Code für alle Konstruktortyp-Datenschutzdaten generisch ist. Bei einigen der hier aufgeführten Lösungen wird dies fehlschlagen, aber es sollte klar sein, dass so gut wie alle auf Verschlüssen basierenden Lösungen auf unterschiedliche Weise auf diese Weise beschädigt werden könnenreplace()
Parametern auf beschädigt werden können.
Nachdem dies ausgeführt wurde, verfügt jedes mit erstellte Objekt new Foo()
über eine eval
Methode, die aufgerufen werden kann, um Werte oder Methoden zurückzugeben oder zu ändern, die im Abschluss des Konstruktors definiert sind, z.
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
Das einzige Problem, das ich dabei sehen kann, ist, dass es in Fällen, in denen es nur eine Instanz gibt und die beim Laden erstellt wird, nicht funktioniert. Es gibt jedoch keinen Grund, einen Prototyp tatsächlich zu definieren. In diesem Fall kann der Angreifer das Objekt anstelle des Konstruktors einfach neu erstellen, solange er die Möglichkeit hat, dieselben Parameter zu übergeben (z. B. sind sie konstant oder werden aus verfügbaren Werten berechnet).
Meiner Meinung nach macht dies Crockfords Lösung ziemlich nutzlos.Da die "Privatsphäre" leicht verletzt werden kann, sind die Nachteile seiner Lösung (verminderte Lesbarkeit und Wartbarkeit, verminderte Leistung, mehr Speicher) die prototypbasierte Methode "keine Privatsphäre" die bessere Wahl.
Normalerweise verwende ich führende Unterstriche zum Markieren __private
und für _protected
Methoden und Felder (Perl-Stil), aber die Idee, Datenschutz in JavaScript zu haben, zeigt nur, dass es sich um eine missverstandene Sprache handelt.
Daher bin ich mit Crockford bis auf seinen ersten Satz nicht einverstanden .
Wie erhalten Sie echte Privatsphäre in JS? Stellen Sie alles, was erforderlich ist, um privat zu sein, auf die Serverseite und verwenden Sie JS, um AJAX-Aufrufe auszuführen.