Gibt es eine Möglichkeit zu verhindern, überschreiben/überschreiben von Funktionen/Variablen singleton-Instanz?
Betrachten dieser pseudo-code:
(function(window){
var options = { /*where everything goes */ };
var instance = (function(options){
for (var i in options){
if (options.hasOwnProperty(i)){
this[i] = options[i];
}
}
})(options);
instance.callbacks = function(cb){
//...
}
instance.is_allowed = function()
//... checks, return boolean
}
window.instance = instance;
})(this);
Wenn jemand jemals gewünscht, um zu manipulieren-code (ein böswilliger Benutzer zum Beispiel), er würde schreiben, die is_allowed
Funktion mit seinem eigenen, zum Beispiel über die Adressleiste (die er nicht haben firebug, wer weiß).
javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();
Dies ist ein naives Beispiel, aber das ist der Punkt, alles in Javascript überschrieben werden kann.
Ich weiß, in es5 haben wir das Objekt.defineProperty so können Sie set:
//being explicit
Object.defineProperty(instance, "is_allowed", {
enumerable: false,
configurable: false,
writable: false,
value: function(){
//do checks
}
});
Eigentlich, was das BESTE in diesem Sinne ist die Verwendung Object.freeze(instance)
oder Object.seal(instance)
statt Object.defineProperty
da die später erneut aufgerufen werden kann, mit writable: false
(albern, nicht wahr?)
Gibt es eine Möglichkeit, dass es funktioniert in alten Browsern (nämlich IE6-8), ohne zu viel Aufwand? Wenn es unmöglich ist, dann werde ich nur Schulterzucken und weitergehen.
InformationsquelleAutor der Frage pocesar | 2013-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Er konnte schreiben Sie Ihre gesamte javascript-code oder verwenden Sie einen browser, sondern beispielsweise ein "browser-weniger" - Anforderung an den server.
Nicht. Alles, was Sie Global setzen kann vom Benutzer geändert werden, es ist bis auf den Browser beschränken, das
javascript:
Verhalten zu vermeiden, Benutzer zu täuschen, um access-pre-gestaltete links. Firefox vor kurzem haben einige Arten von änderungen an der javascript-URL-Protokoll.Wie gesagt zu diesem Artikel: http://survey-remover.com/blog/javascript-protocol-dangers/
So...
Sollten Sie.
InformationsquelleAutor der Antwort Fagner Brack
Vorschlag
Ich nicht sagen, ich bin ein Experte für diese Dinge. Aber vorausgesetzt, Sie können wickeln Sie Ihren code vollständig und verwenden, Ereignisse auszulösen, Verhalten Sie verwenden können, eine Struktur wie diese:
Einrichten mit
obj = Closed("Anything");
können Sie noch ein böswilliger Benutzer überschreiben dieuse_secret()
Methode, da es ausgesetzt ist, aber dieget_secret()
Methode, und alle anderen Einbauten sind geschützt.Wenn Ihr die init-Methode deklariert eine Anzahl von Ereignis-bindings, um die Anwendung, die Sie halten können Ihren Staat-privat in dieser Weise. Die Ereignisse werden in der Lage sein, um die trigger-interne Methoden, da Sie gebunden, wo von innen die innere Schließung externen code aber gar nicht sehen.
Reservierungen
Während dies vielleicht dein problem löst, bin ich mir nicht 100% sicher, dass es das tut, ist nicht zu trauen, eh. Alle Benutzer, die wollen, zu durchdringen, Ihre Anwendung kann so lange, wie die Sicherheit auf der client-Seite. Es gibt nichts zu stoppen Sie von crafting Ihre eigenen Objekt zu ersetzen, die der ihrigen nach der Tat sowieso, ES5 oder keine ES5.
Für alles, was wirklich braucht, um sicher zu sein, müssen Sie erneut validieren auf server-Seite. Vertrauen Sie nie auf client-Seite code, um Sie zu schützen, wird die Anfrage möglicherweise nicht einmal von der Seite, die Sie bedient ...
InformationsquelleAutor der Antwort Jonas Schubert Erlandsson
Was ist, wenn
is_allowed
wäre komplett vor Ort?jsBin mockup
BTW: im code
window.instance
wäreundefined
.InformationsquelleAutor der Antwort KooiInc