Ecco un'idea. Che cosa succede se si è utilizzato un analizzatore statico (qualcosa che è possibile creare con esprima, ad esempio) per determinare quali variabili esterne vengono utilizzate dal codice eval'd e come alias. Per "codice esterno" intendo le variabili il codice eval'd utilizza ma non dichiara.Ecco un esempio:
eval(safeEval(
"var x = window.theX;"
+"y = Math.random();"
+"eval('window.z = 500;');"))
dove safeEval restituisce la stringa javascript modificato con un contesto che blocca l'accesso a variabili esterne:
";(function(y, Math, window) {"
+"var x = window.theX;"
+"y = Math.random();"
+"eval(safeEval('window.z = 500;');"
"})();"
ci sono un paio di cose che puoi fare ora con questo:
- È possibile garantire che il codice eval'd non possa leggere i valori delle variabili esterne, né scrivere su di essi (passando
undefined
come argomenti della funzione, o non passando argomenti). O potresti semplicemente lanciare un'eccezione nei casi in cui le variabili non sono accessibili.
- È inoltre garantire che le variabili create da eval non influenzano l'ambito circostante
- Si potrebbe consentire eval per creare variabili intervenute nell'area circostante dichiarando le variabili al di fuori della chiusura anziché come funzione di parametri
- Si potrebbe consentire accesso in sola lettura da copia valori delle variabili al di fuori e li utilizzano come argomenti alla funzione
- Si potrebbe permettere lettura e scrittura a variabili specifiche dicendo safeEval di non alias quei nomi particolari
- È possibile rilevare casi in cui la valutazione fa non modificare una particolare variabile e consentire che venga automaticamente escluso dall'essere alias (es. Matematica in questo caso, non viene modificata)
- Si potrebbe dare l'eval un contesto in cui eseguire, passando valori degli argomenti che possono essere differente rispetto al contesto circostante
- è possibile catturare cambiamenti di contesto da anche restituire gli argomenti della funzione dalla funzione in modo da poterli esaminare al di fuori dell'eval.
noti che l'utilizzo di eval
è un caso speciale, dato che per sua natura, è efficace non può essere avvolto in un'altra funzione (che è il motivo per cui dobbiamo fare eval(safeEval(...))
).
Naturalmente, fare tutto questo lavoro può rallentare il codice, ma ci sono certamente posti in cui il successo non conta. Spero che questo aiuti qualcuno. E se qualcuno crea una dimostrazione di concetto, mi piacerebbe vedere un link ad esso qui;)
fonte
2013-08-11 20:44:16
Non so se funzionerà per 'eval', ma si può provare a passare il suo contesto di esecuzione (oggetto di attivazione di google). – jfs
Dai un'occhiata all'implementazione dojox.secure.sandbox. – jfs
Ora, quello che probabilmente vuoi è un Web Worker. – bjb568