2011-02-18 80 views
6

我在一個較大的C#項目的一小部分內使用DLR,IronPython是有問題的語言。.NET DLR安全或沙盒腳本

對於系統的某些部分,用戶可以輸入一個小腳本來爲他們​​定製行爲。我想要做的是能夠限制他們使用副作用免費的純函數或在某種沙箱中,這樣他們的功能就不會碰到任何外部的東西。

此外,用戶只能輸入一個函數體,函數頭和參數說明在被傳遞到Python DLR引擎之前會自動預先寫入代碼中,以便調用它的系統的C#端完全知道要走過,什麼回來。用戶只需要基於作爲參數提供的值進行簡單的操作和測試。

例如

這是確定:return (a * 100) > b;

這是不正常:delete_file_system(); return (a * 100) > b;

會如何實現這一目標?是否有更合適的語言或技術選擇?

回答

7

執行此操作的方法是創建一個沙盒應用程序域,然後在該應用程序域中運行腳本。您可以在此處找到有關創建沙盒域的說明:http://msdn.microsoft.com/en-us/library/bb763046.aspx

要運行應用程序域中的代碼,您可以使用接受AppDomain的Python.CreateEngine重載。然後,該引擎中執行的所有代碼都將在該應用程序域中運行。

如果要將用戶代碼回撥到主機中,您可以創建一個從MarshalByRefObject派生的類,並將其放入該範圍以供其訪問和回叫。通話將通過您的正常應用程序域,您可以完成您通常能夠完成的任何事情。

ObjectOperations和ScriptScope上還有一些API,這些API與ObjectHandles一起使用,用於在遠程域中對對象執行操作。