Semi-sandboxing JavaScript eval
tło: Pracuję nad frameworkiem / biblioteką, która ma być używana w konkretnej witrynie w koordynacji z greasemonkey / userscripts. Ta struktura / biblioteka pozwoli na obsługę dodatków. Sposób, w jaki będzie działał, to dodatek rejestrujący się z listą wymaganych bibliotek, zasobów, ectera i biblioteka poczeka na spełnienie wszystkich kryteriów, aby wywołać addonload()
funkcjonować.
Problem: W tej liście „wymaganych rzeczy” chcę, aby devony addon mogły określić javascript (jako ciąg znaków), który ma być oceniany jako „wymagany zasób”. Na przykład'document.getElementById("banana")'
. To, co chcę zrobić, to pół-sandbox oceny „wymaganego zasobu”, aby ocena mogła uzyskać dostęp do obiektów okna i DOM, ale nie jest w stanie ich bezpośrednio zmienić. Chciałbym też, aby eval i evalJS były niedostępne z piaskownicy.
Przykłady:
document.getElementById("banana")
-> ważnedocument.getElementById("apple).id = "orange"
-> nieprawidłowywindow.grape
-> ważnewindow.grape = 'potato'
-> nieprawidłowy(someObj.applesCount > 0 ? 'some' : 'none')
-> ważne
Co mam do tej pory:
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;
}
Uwagi:
To jest Greasemonkey / usercript. Nie mam bezpośredniego dostępu do zmiany strony lub javascript.
Wejście dlasafeEval()
może to być dowolny poprawny javascript, czy to zapytanie DOM, czy proste oceny, o ile nie zmienia to obiektu okna ani DOM.