我需要運行一個完全由用戶編寫的Javascript函數。我給他提供了一個框架,但是細節是他要指定的,例如如何運行用戶提供的Javascript沒有安全問題(如jsFiddle,jsBin等)?
function main(model, console) {
// the user can enter anything here
// ideally, he would only be allowed to
// use the methods that "model" and "console" provide, e.g.
var item = model.getItems();
console.log("Found " + item.length + " items.");
}
爲了讓應用程序正常工作,用戶只需要訪問參數的方法和屬性(他明確地不需要的文件或窗口訪問或發送XMLHttpRequests
)。
我已經閱讀了幾篇關於eval()函數的文章,以及如何使用它來運行代碼。我還閱讀了StackOverflow上的其他文章(how jsFiddle runs code,eval in general等),但我仍然不確定如何正確執行此操作。
首先:eval()
真正的問題是什麼?攻擊者可以做什麼以及如何防止它(使用白名單,黑名單或用戶輸入消毒庫)? 任何人都可以深入解釋如何jsFiddle和這樣的網站執行用戶輸入?
惡意用戶可以使用'eval'讓你應用程序的cookie(如用戶會話令牌,這將允許他們模擬登錄用戶),客戶端內存中的任何狀態,並請求從服務器獲取更多狀態。它可以將任何數據發佈到另一臺服務器。簡而言之,他們可以擁有你的應用程序。 – joews 2014-09-01 08:40:46
jsfiddle將用戶的文檔放在IFRAME中,並將其運行在不同的域('fiddle.jshell.net'而不是'jsfiddle.net'),因此它無法訪問jsfiddle應用程序。 – Barmar 2014-09-01 08:44:10
你能詳細解釋一下嗎?他們如何交流,這種方法的侷限性是什麼? – WeSt 2014-09-01 08:45:01