2010-04-14 23 views
7

我有一個可以通過反射來加載插件的Web應用程序。它目前使用Assembly.LoadFrom()Activator.CreateInstance()完成此操作。現在,插件被加載到相同的AppDomain中,並可以訪問我的應用程序中的任何內容以及我的應用程序可以訪問的任何內容。限制.net插件可以訪問的內容

我在尋找的是一種限制插件爲安全目的可以訪問的類和方法。我想讓所有的類和方法在被調用時拋出異常,除非它們被列入白名單。我基本上將一個API類和幾個數據傳輸對象中的所有函數列入白名單。

我也不希望插件能夠訪問它自己的文件系統或數據庫。我想我可以在單獨的AppDomain中使用信任級別來實現這一點。

有沒有人有任何好的想法或資源?這是可以通過代碼訪問安全性或.net 4中新的安全透明代碼功能完成的事情嗎?

+0

我猜你沒有一個系統管理員負責保持網站的穩定。誰添加插件?顧客? – 2010-04-15 00:13:54

+0

我們不允許客戶將插件直接上傳到現場。不過,我們正計劃採用客戶給我們的插件,並將它們自己添加到網站中。除非我拆解dll並手動檢查,否則我不確定我是否完全信任它。 – 2010-04-15 00:16:56

回答

3

如果您想應用一般訪問限制,則使用單獨的AppDomain是正確的方法。至於限制對特定於應用程序的邏輯的訪問,只是不要將「應用程序內部」服務對象的實例提供給插件對象。此外,任何不是M​​arshalByRef的引用類型對象都不會跨AppDomain邊界,因此即使存在嘗試返回它們的公開方法,這些對象也是安全的,無法訪問。

+0

這聽起來很有希望,但是阻止插件調用靜態方法或創建對象的新實例的是什麼?我有點擔心插件可能能夠獲取它不應該看到的連接字符串的信息。 – 2010-04-15 00:23:58

+1

創建一個允許擴展安全集成的設計並不重要。您不能阻止對象的實例化或對靜態成員的訪問,但是您完全可以控制對原始AppDomain中任何實際實例的訪問權限。該插件只會顯示你明確使用Marshal的實例。關鍵是插件實例化你的類不應該允許你的應用程序狀態發生變化,因爲它們都不能獲得對你實際應用程序狀態的引用。其他間接副作用(如文件系統或操作系統訪問)通過AppDomain安全設置進行控制。 – 2010-04-15 00:33:42

0

我通常更多的是一個信任的人,所以我會去一個單獨的應用程序域,
但通過你的問題,我想你是有點疲憊,然後我。

如果你真的想要安全起見,我會說在一個單獨的過程中加載插件,並將插件接口交給一個「進程間」橋接器,只是爲了它需要的東西......

這樣,您確定只會選擇插件所需的內容。此外,你可以很容易地啓動這個守護進程,作爲一個對系統調用,文件系統和環境的訪問有限的「弱」用戶。