Evaluación de Javascript en semi-sandboxing
Fondo: Estoy trabajando en un marco / biblioteca que se utilizará para un sitio específico en coordinación con greasemonkey / userscripts. Este marco / biblioteca permitirá soporte adicional. La forma en que funcionará es que un complemento se registre con la biblioteca que enumera las páginas requeridas, los recursos, el ectera y la biblioteca esperará hasta que se cumplan todas las críticas para llamar al complementoload()
función.
La cuestión: En esta lista de 'cosas necesarias' quiero que los desarrolladores de complementos puedan especificar javascript (como cadena) para que se evalúen como un 'recurso requerido'. Por ejemplo'document.getElementById("banana")'
. Lo que quiero hacer es hacer una evaluación de 'recurso requerido' en semi sandbox para que la evaluación pueda acceder a los objetos de ventana y DOM, pero no puede alterarlos directamente. También me gustaría hacer que eval, y evalJS sean inaccesibles desde el sandbox.
Ejemplos:
document.getElementById("banana")
-> válidodocument.getElementById("apple).id = "orange"
-> inválidowindow.grape
-> válidowindow.grape = 'potato'
-> inválido(someObj.applesCount > 0 ? 'some' : 'none')
-> válido
Lo que tengo hasta ahora:
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;
}
Notas:
Este es un Greasemonkey / userscript. No tengo acceso directo para modificar el sitio, o es javascript.
La entrada parasafeEval()
puede ser cualquier javascript válido, ya sea una consulta de DOM o evaluaciones simples siempre que no altere el objeto de la ventana o DOM.