Semi-Sandboxing Javascript auswerten
Hintergrund: Ich arbeite an einem Framework / einer Bibliothek, die für eine bestimmte Site in Abstimmung mit greasemonkey / userscripts verwendet werden soll. Dieses Framework / diese Bibliothek ermöglicht die Unterstützung von Addons. Die Art und Weise, wie es funktioniert, ist ein Addon-Register, in dem die Bibliothek die erforderlichen Seiten, Ressourcen, Ectera und die Bibliothek auflistet und wartet, bis alle Kriterien erfüllt sind, um das Addon aufzurufenload()
Funktion.
Die Angelegenheit: Ich möchte, dass Addon-Entwickler in dieser Auflistung der 'erforderlichen Inhalte' Javascript (als Zeichenfolge) angeben können, das als 'erforderliche Ressource' ausgewertet werden soll. Zum Beispiel'document.getElementById("banana")'
. Was ich tun möchte, ist die Halb-Sandbox-Evaluierung der 'erforderlichen Ressource', damit die Evaluierung auf die Fenster- und DOM-Objekte zugreifen kann, diese jedoch nicht direkt ändern kann. Ich möchte auch eval und evalJS vom Sandkasten aus unzugänglich machen.
Beispiele:
document.getElementById("banana")
-> gültigdocument.getElementById("apple).id = "orange"
-> ungültigwindow.grape
-> gültigwindow.grape = 'potato'
-> ungültig(someObj.applesCount > 0 ? 'some' : 'none')
-> gültig
Was ich bisher habe:
function safeEval(input) {
// Remove eval and evalJS from the window:
var e = [window.eval, window.evalJS], a;
window.eval = function(){};
window.evalJS = function(){};
try {
/* More sanition needed before being passed to eval */
// Eval the input, stuffed into an annonomous function
// so the code to be evalued can not access the stored
// eval functions:
a = (e[0])("(function(){return "+input+"}())");
} catch(ex){}
// Return eval and evalJS to the window:
window.eval = e[0];
window.evalJS = e[1];
// Return the eval'd result
return a;
}
Anmerkungen:
Dies ist ein Greasemonkey / Userscript. Ich habe keinen direkten Zugriff, um die Website zu ändern, oder es ist Javascript.
Die Eingabe fürsafeEval()
Dies kann ein beliebiges gültiges Javascript sein, sei es eine DOM-Abfrage oder einfache Auswertungen, solange das Fensterobjekt oder DOM nicht geändert wird.