2013-05-20 62 views

回答

4

你想要的功能是eval

function funCode() { 
    eval(getCode()); 
}; 
2

您可以使用the built-in eval function

function runCode() { 
    eval(getCode()); 
} 

注意,這個函數是一個有點 「神奇」;解釋者會從周圍的詞彙語境中提供信息。因此,它必須被稱爲eval;您無法設置run = eval,然後致電run。 (但是,您可以編寫function run(s) { return eval(s); }。)

2

eval()是您正在查找的函數。

但明智地使用它或根本不使用它,因爲它充滿了安全風險。

var exec_string = 'alert(\'Hello, World!\')'; 
eval(exec_string); 

輸出 「你好,世界!」在警報

+0

+1提醒安全 – Steve

1

正如其他海報指出,eval是存在用於此目的的方法。但是,eval將執行任何JavaScript代碼,而不管它是否有害(例如,來自第三方源的JavaScript可能具有無限循環或更糟糕的惡意行爲)。有共同的副歌

eval == evil 

並且這樣EVAL通常被認爲是反模式。但是,採取這種簡單的方法是錯誤的。相反,如果您希望評估的字符串可以信任,那麼使用eval是完全可以接受的。但事實證明,這種情況確實存在的情況相對較少。顯然,來自第三方網站的任何內容都是危險的(即使您相信所有者,他們可能已被黑客入侵)。即使從你自己的服務器,你可能容易受到「中間人」攻擊,儘管這在大多數網站中是不太可能的。

需要評估JavaScript字符串的最常見原因是呈現第三方網頁。在這種情況下,通常最好在服務器上呈現頁面(例如http://phantomjs.org/),然後將結果發送到瀏覽器。這樣瀏覽器就不會運行不安全的代碼。

另一個越來越常見的用例是交互式教程網站,用戶可以查看他們輸入的代碼的結果。在這種情況下,您不會擔心惡意腳本是用戶將遭受的唯一攻擊是他/她打字的那些人。但在這種情況下,您仍然擔心會破壞您網站功能的錯誤(例如無限循環),因此仍建議您在服務器上執行評估(使用適當的安全措施),以便輸入的javascript不會破壞任何內容。

一個可能的替代eval是谷歌的cajahttps://code.google.com/p/google-caja/),它旨在解決所有這些問題,但是我從來沒有用它自己,不能在它的用處發表評論。

3

雖然eval()當然有效,但另一種選擇是取代碼並將其傳遞給構造函數Function。這會以您的代碼作爲函數體創建一個新函數。

這樣做有一些好處。

  • 它的變量範圍將是全球範圍內,所以你運行該代碼將不會與任何局部變量
  • 它具有更好的性能
  • 可以強制代碼爲嚴格模式干擾,並能影着windowself標識符,因此很難創建全局變量

funciton runCode() { 
// create `window` param---v   v--- and `self` param 
    var f = new Function("window", "self", " 'use strict'; " + getCode()) 
       // force strict mode -----------^ 
    var self = {} 
    f.call(self, self, self); // pass an object to the `window` and `self` param 
           // and set the same object as the `this` value 
} 

這當然不能提供完全的安全性,但可以爲運行代碼提供更多的「沙箱」。

您也可以在調用之後檢查self對象,看它是否嘗試創建任何全局變量。

將代碼或函數執行封裝在try/catch中,然後檢查所引發的任何錯誤也可能很有用。

+0

但是,這仍然受到影響eval –

+0

的所有(大部分)安全問題,我認爲它應該是......,「'嚴格使用';」 + ...所以它是一個字符串文字,不是兩個自由單詞。 –

+0

@jJ':絕對!我會更新。感謝您的支持。 – 2013-05-21 20:23:44

相關問題