我該如何運行一個字符串 好像它在哪裏的javascript代碼?如何運行一個字符串,就好像它在哪裏的JavaScript代碼?
//The user inputs javascript code and clicks run and it runs the javascript code
function getCode() {
retrun code();
}
funciton runCode() {
run(getCode());
}
我該如何運行一個字符串 好像它在哪裏的javascript代碼?如何運行一個字符串,就好像它在哪裏的JavaScript代碼?
//The user inputs javascript code and clicks run and it runs the javascript code
function getCode() {
retrun code();
}
funciton runCode() {
run(getCode());
}
你想要的功能是eval
。
function funCode() {
eval(getCode());
};
您可以使用the built-in eval
function:
function runCode() {
eval(getCode());
}
注意,這個函數是一個有點 「神奇」;解釋者會從周圍的詞彙語境中提供信息。因此,它必須被稱爲eval
;您無法設置run = eval
,然後致電run
。 (但是,您可以編寫function run(s) { return eval(s); }
。)
eval()是您正在查找的函數。
但明智地使用它或根本不使用它,因爲它充滿了安全風險。
var exec_string = 'alert(\'Hello, World!\')';
eval(exec_string);
輸出 「你好,世界!」在警報
正如其他海報指出,eval
是存在用於此目的的方法。但是,eval
將執行任何JavaScript代碼,而不管它是否有害(例如,來自第三方源的JavaScript可能具有無限循環或更糟糕的惡意行爲)。有共同的副歌
eval == evil
並且這樣EVAL通常被認爲是反模式。但是,採取這種簡單的方法是錯誤的。相反,如果您希望評估的字符串可以信任,那麼使用eval是完全可以接受的。但事實證明,這種情況確實存在的情況相對較少。顯然,來自第三方網站的任何內容都是危險的(即使您相信所有者,他們可能已被黑客入侵)。即使從你自己的服務器,你可能容易受到「中間人」攻擊,儘管這在大多數網站中是不太可能的。
需要評估JavaScript字符串的最常見原因是呈現第三方網頁。在這種情況下,通常最好在服務器上呈現頁面(例如http://phantomjs.org/),然後將結果發送到瀏覽器。這樣瀏覽器就不會運行不安全的代碼。
另一個越來越常見的用例是交互式教程網站,用戶可以查看他們輸入的代碼的結果。在這種情況下,您不會擔心惡意腳本是用戶將遭受的唯一攻擊是他/她打字的那些人。但在這種情況下,您仍然擔心會破壞您網站功能的錯誤(例如無限循環),因此仍建議您在服務器上執行評估(使用適當的安全措施),以便輸入的javascript不會破壞任何內容。
一個可能的替代eval
是谷歌的caja
(https://code.google.com/p/google-caja/),它旨在解決所有這些問題,但是我從來沒有用它自己,不能在它的用處發表評論。
雖然eval()
當然有效,但另一種選擇是取代碼並將其傳遞給構造函數Function
。這會以您的代碼作爲函數體創建一個新函數。
這樣做有一些好處。
window
和self
標識符,因此很難創建全局變量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
中,然後檢查所引發的任何錯誤也可能很有用。
但是,這仍然受到影響eval –
的所有(大部分)安全問題,我認爲它應該是......,「'嚴格使用';」 + ...所以它是一個字符串文字,不是兩個自由單詞。 –
@jJ':絕對!我會更新。感謝您的支持。 – 2013-05-21 20:23:44
+1提醒安全 – Steve