2014-09-01 52 views
2

我需要運行一個完全由用戶編寫的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 codeeval in general等),但我仍然不確定如何正確執行此操作。

首先:eval()真正的問題是什麼?攻擊者可以做什麼以及如何防止它(使用白名單,黑名單或用戶輸入消毒庫)? 任何人都可以深入解釋如何jsFiddle和這樣的網站執行用戶輸入?

+0

惡意用戶可以使用'eval'讓你應用程序的cookie(如用戶會話令牌,這將允許他們模擬登錄用戶),客戶端內存中的任何狀態,並請求從服務器獲取更多狀態。它可以將任何數據發佈到另一臺服務器。簡而言之,他們可以擁有你的應用程序。 – joews 2014-09-01 08:40:46

+3

jsfiddle將用戶的文檔放在IFRAME中,並將其運行在不同的域('fiddle.jshell.net'而不是'jsfiddle.net'),因此它無法訪問jsfiddle應用程序。 – Barmar 2014-09-01 08:44:10

+0

你能詳細解釋一下嗎?他們如何交流,這種方法的侷限性是什麼? – WeSt 2014-09-01 08:45:01

回答

3

請問eval ed碼能做什麼?它可以做你的代碼可以做的任何事情;它在相同的上下文中被評估。

創建一個系統允許第三方代碼運行,同時保護自己是非常困難和充滿機會拍攝自己的腳。試圖製作自己的解決方案是一個非常糟糕的主意。

幸運的是,有很多由非常聰明的人創建的測試項目,努力使其安全地運行第三方代碼。最突出的將是Google Caja和Douglas Crockford的ADsafe

正如@Barmar指出的那樣,JSFiddle在不同域的iframe中運行代碼,這會導致瀏覽器不允許iframe中的代碼訪問父頁面,因爲Same Origin Policy

2

運行不受信任的JavaScript的正確方法是將其放入沙盒環境中。下面是我自己的恰好提到目的編寫的Jailed library所使用的技術:

對於Node.js的:

  1. 創建子進程;加載代碼爲一個字符串(如果有路徑,請閱讀文件內容);

  2. 在代碼的開頭添加use strict;(爲了防止使用arguments.callee.caller破壞沙箱);

  3. 使用vm.runInNewContext()在單獨的上下文中評估該字符串,其中提供的​​僅公開一些基本方法,如setTimeout()

對於Web瀏覽器:

  1. 創建一個sandbox attribute一個iframe(以便其內容服從跨域政策,因此無法訪問主應用程序);

  2. 創建一個iframe內的一個網絡工作者(使用戶submited代碼會得到其自己的線程,因此不會凍結UI)

相關問題