2012-04-13 48 views
5

我想在應用程序中提供最終用戶腳本(可運行服務器端)。我一直在閱讀,並發現沙盒比我想象的更爲棘手。最終用戶腳本

我真的不在乎什麼語言是。 LUA,Python,JavaScript,我可以閱讀任何東西。

在一個不受信任的腳本中運行一個函數,傳遞一些信息並獲得更多信息有多難?我讀過JVM安全管理器是一個不行,Python幾乎不可用,但我對這個主題知之甚少,不能真正判斷源。例如,我如何解釋JS中的一個函數,該函數需要一個JSON(從Java或Python甚至是node.js)並獲取返回的JSON?

我想避免自己實現一個pythonish i-just-know-it-will-suck語言解釋器。

+3

JavaScript似乎是最安全的選擇。它基本上是爲這個確切的目的而設計的。 – 2012-04-13 13:59:12

+1

至於沙盒Python,有[一些建議](http://wiki.python.org/moin/Asking%20for%20Help/How%20can%20I%20run%20an%20untrusted%20Python%20script%20safely%20 %28i.e.%20Sandbox%29)。 – 2012-04-13 14:01:06

+0

@Lattyware:保護CPython的建議基本上沒用,恕我直言。他們推薦chrooting(這是不安全的)和虛擬化(這是昂貴的)。 – 2012-04-13 14:02:51

回答

4

Lua具有良好的沙盒功能,乾淨簡單。

它具有可在特定環境中運行代碼的setfenv()函數。不受信任的代碼只能訪問特定環境中的內容。
對於C函數(例如string.rep),可以通過將其替換爲Lua函數或向lua_newstate提供自定義內存分配程序來防止內存過度消耗。另外,如果您決定要使用Lua作爲受信任的代碼並使其與不受信任的代碼接口,則可以使用coroutinesdebug.sethook來控制CPU使用率。

Lua Wiki有一個簡單的example sandbox
lua live demosource code也可能引起人們的興趣。

+0

感謝您的推薦和參考!我四處閱讀,並決定我會去這裏,看看它帶領我。看起來不錯! – slezica 2012-04-15 21:56:14

1

Tcl具有非常強大的sanbox模型,並且可以說是用於最終用戶腳本的更好的語言之一。您可以在safe interpreter手冊頁閱讀更多關於它的信息。