2012-06-15 22 views
6

Esiste un modo per specificare quale oggetto utilizzare per globale quando si richiama eval()?Utilizzo di eval() con una globale personalizzata

(Non sto chiedendo come fare eval globale()).

Questo non funziona, ma questo illustra quello che vorrei:

var pseudoGlobal = {}; 
eval("x = 12", pseudoGlobal); 
pseudoGlobal.x; // 12 

Il punto è che i veri attacchi globali non influenzato dalla dichiarazione di variabili implicite (cioè senza var parole chiave) nel codice eval() 'ed.

Per quanto riguarda eval.call(pseudoGlobal, "x=12") o eval.apply(pseudoGlobal, ["x=12"]), alcuni interpreti non lo consentono.

+1

L'intento è creare un ambiente di esecuzione isolato/controllato/protetto all'interno di JavaScript. – gawi

risposta

3

È possibile, ovviamente, oggetto predefinito sostituto per l'assegnazione di un valore di proprietà, come in

with (pseudoGlobal) eval("x=12") 

ma non per la creazione di un propery. Se una proprietà non viene trovata nello stack corrente dei contesti di esecuzione, viene creata nell'oggetto globale. Questo è tutto ciò che c'è da fare. Si potrebbe provare alcune cose strane, anche:

//global code 
var globalvars = {}; 
for (i in this) 
    globalvars[i] = null; 
with (pseudoGlobal) 
    eval("x=12") 
for (i in this) 
    if (!(i in globalvars)) 
{ 
    pseudoGlobal[i] = this[i]; 
    delete this[i]; 
} 

Se vi preoccupate per attacchi globali, provare:

var globalvars = {}; 
for (i in this) 
    globalvars[i] = this[i]; 
with (globalvars) 
    eval("x=12") 

questo modo le associazioni saranno cambiate in globalvars. Nota, quella copia superficiale impedirà il cambiamento di un solo livello di abbuffate.

+0

Per quanto riguarda il secondo blocco di codice, ciò non impedisce a uno script di modificare i collegamenti nell'oggetto globale reale. – gawi

+0

Ho preso la tua domanda al valore nominale, ma ancora non tutto è perduto ... Aggiornato la risposta –

+0

E se faccio 'eval ('" use strict ";' + code)', mentre limita il codice che può essere valutato() ', questo impedisce di creare associazioni aggiuntive nell'ambito globale. Questo ci lascia con possibili mutazioni di livello 2 + binding. – gawi

1

Non esiste un modo integrato per eseguire questa operazione.

Ci sono due soluzioni che vengono in mente:

  • prefisso tutte le assegnazioni nel codice eval ed. Ad esempio, invece di x = 12, dovresti fare qualcosa come o.x = 12.
  • Scrivi il tuo interprete Javascript che esegue la sandbox dello script e restituisce un oggetto con tutte le variabili assegnate.
+0

Peccato che non possiamo creare il nostro ambiente di esecuzione con Javascript. Ci deve essere qualche buona ragione per Javascript per prevenire questo. Ho la sensazione che sia un po 'più complicato di quanto pensassi (catene prototipo? Costruttori? Funzioni native?). – gawi

Problemi correlati