JS utilizza un modello di sicurezza basato su riferimenti, quindi se la tua estensione non può ottenere un riferimento al segreto, non può accedere al segreto. A meno che l'estensione controlli (e sovrascrive) il caricamento degli script di pagina, uno script può essere costruito per condividere segreti in un modo in cui il codice pre-run o post-run non può interferire direttamente con.
La parte difficile è l'autenticazione della parte bisognosa perché un getSecret () ingenuo è poco più sicuro di window.secret = blah. Introduci le due parti, consenti loro di autoregolarsi senza variabili pubbliche, e quindi elimina ulteriori riferimenti. Questo ti permetterà di collegare i due pezzi in modo tale da poter essere tagliato, ma non tappato o falsificato.
// 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
Naturalmente, questo potrebbe mettere una porta del caveau di una banca su una tenda se l'oggetto XMLHttpRequest viene manomesso, gli script della pagina vengono sostituiti completamente con un'estensione o se il server non è HTTPS. In breve, mentre lo schema del modulo rivelatore dovrebbe essere a prova di proiettile, l'applicazione del modello potrebbe non essere.
EDIT: assicurati di non codificare i dati segreti nel codice sorgente, ma piuttosto di recuperare i dati, impostare mySecretData e quindi chiamare immediatamente meet()
.