2016-02-11 26 views
2

我正在寫一個簡單的庫,它將從給定字符串屬性的對象讀取值。在JS對象中注入自執行函數作爲值

是否可以讀取屬性,但有一個函數可以執行而不實際調用該函數?

類似:

var obj = { 

fn : (function malicious(){ deleteLotsOfFiles(); 
})() 

} 

,如果我做

var foo = obj.fn; 

是有辦法通過閱讀財產執行(惡意)的功能?

+3

您可以使用[MDN:Object.defineProperty()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)爲屬性定義getter。你也可以看看這個問題[如何使用javascript Object.defineProperty](http://stackoverflow.com/questions/18524652/how-to-use-javascript-object-defineproperty) –

+0

爲什麼你不相信你的論點? – Bergi

回答

1

甚至在引用它之前,惡意函數已經執行了。一旦函數被引擎解析,它就會立即執行(自我調用)。

2
var obj = { 
    get fn() { deleteLotsOfFiles(); } 
}; 

// later 
var o = obj; // deleteLotsOfFiles has not been executed 
console.log(o.fn); // you just deleted lots of files 
1

一種替代

var o = Object.defineProperty(o, 'baz', { 
    get: function(){ 
     console.log("Delete Everything!"); 
    } 
}); 

然後訪問o.baz並且它們被從MDN

刪除上的吸氣劑

更多信息有時期望的是允許訪問一個返回012的財產動態計算值,或者您可能想要反映內部變量的狀態 而不需要使用明確的方法 調用。

看起來很像你想要做的事情。