JS usa un modelo de seguridad basado en referencias, por lo que si su extensión no puede obtener una referencia al secreto, no puede acceder al secreto. A menos que la extensión controle (y anule) la carga de los scripts de página, se puede construir un script para compartir secretos de una manera en que el código de ejecución previa o posterior no pueda interferir directamente.
La parte difícil es autenticar la parte necesitada porque un getSecret () ingenuo es poco más seguro que window.secret = blah. Presente las dos partes, permita que se refieran a sí mismas sin variables públicas y luego añada más referencias. Esto le permitirá conectar las dos piezas de tal manera que se puedan cortar, pero no se pueden golpear o falsificar.
// this part contains a secret only specific other code should see:
var hasSecret=(function(){
var mySecretRef; // an object refrence, to be populated at run-time
var mySecretData = ["I like anchovies"]; // in array so it can be updated later
var out={};
out.meet=function(obj){
mySecretRef = obj; // bake-in a specific object
delete out.meet; // burn this bridge
// define a method that can only use the non-replaceable baked-ins:
out.reveal= mySecretRef.obtain.bind(mySecretRef, mySecretData);
Object.freeze(out); // just for easier debugging on attempts under global "use strict"
};
return out;
}());
// this code needs a secret that no other code should see and only one part has (the above)
var getSecret={
obtain: function(secret){
prompt("The Secret Is", secret || "N/A"); // (instead of demo prompt(), custom app-logic goes here)
}
};
// kick the tires a little bit:
hasSecret.meet(getSecret); // bake-in object relationship, the prime "feature" of this pattern
hasSecret.reveal = Boolean; // attack: try to over-ride reveal()
getSecret.obtain(); // attack: obtain() can be manually called, but has no secret data
hasSecret.reveal() // legit: shows "I like anchovies" (the secret) by calling getSecret.obtain() callback
getSecret.obtain = function(secret){ return "This is a fake secret";}; // attack: try to over-ride obtain()
hasSecret.reveal() // legit: shows "I like anchovies" still, as desired
hasSecret.meet({}); // attack: remeet (throws error since meet() is gone
Por supuesto, esto podría ser poner una puerta de bóveda de banco en una tienda de campaña si el objeto XMLHttpRequest se manipula, los scripts de la página se reemplazan directamente con una extensión, o si alguno de los servidores no es HTTPS. En resumen, aunque el patrón del módulo revelador en sí debería ser a prueba de balas, la aplicación del patrón podría no serlo.
EDITAR: asegúrese de no codificar los datos secretos en el código fuente, sino de buscar los datos, establecer mySecretData e inmediatamente llamar a meet()
.