2011-08-04 19 views
1

我們必須開發一個遊戲,用戶可以上傳他們的代碼,例如Rock Paper Scissor。他們必須從接口類實現一些方法,並且在我們的遊戲類中稱它們爲特殊的。差異包中的兩個類如何隔離它們?

用戶代碼位於軟件包中,我們沒有名稱衝突,
但主要話題:我們如何確保用戶A不會從用戶B的類中調用方法?

回答

0

這些都是猜測,但看:

  • 安全管理員
  • 檢查非法行動的字節碼(例如用ASM)
  • 每場比賽

一個單獨的類加載器或者,您可以讓用戶上傳腳本而不是真正的Java代碼,例如您可以使用Rhino運行的ECMAScript。

0

如果包括,在程序運行一些別人的一個代碼,沒有什麼能阻止他們打電話給你的方法。

你可以讓你的方法包私人和密封包裝,等等,但你仍然要處理反射等

如果我在那裏你,我會考慮與用戶代碼通過接口一個明確定義的網絡協議或通過標準輸入/輸出。

+0

我相信私人方法可以通過安全經理的反思來保證,但我沒有任何經驗。 –

3

這樣做的一種方法是在不同的類加載器中加載這兩個類。爲了完全安全,您還需要在安全沙箱中運行這些類,以阻止可能繞過類加載器障礙的反射和其他機制。


實際上,我認爲這可能存在缺陷。如果兩個「播放器」類實現相同的接口,則它們可以以複數形式調用共享接口中定義的方法。事實上,它們被加載到不同的類加載器中,因此不能使用其他類型的加載器並不能阻止它。因此,你基本上依靠阻止反射(以及良好的編程)來防止一個類/對象揪出另一個類的實例。阻止反射還可以防止一個類破壞另一個類的封裝,或者調用未在公共超類或共享接口中定義的方法。

+0

這肯定會有助於防止名稱衝突,但我不認爲它會阻止遊戲間的交叉通信(如果某人可以通過某種方式獲得另一個遊戲的句柄) –

+0

我認爲這就是OSGi如何做到的 - 您獲得了很多NoClassDefFound錯誤,如果您配置錯誤配置。 – Roadrunner

+1

@ Bart van Heukelom - 你是對的。更新我的答案來解決這個問題。 –

0

一種簡單的方法可以確保所有方法都有protecteddefaultaccess modifier,這樣封裝外部沒有人可以訪問它們。

+0

但是我需要訪問這些方法,因爲我的遊戲主類是從用戶調用類。 我使用安全管理器啓動整個程序,因此他們沒有文件訪問權限...... – Nicolas

0

只要這些都是公共方法,除非你在不同的類加載器中隔離,否則每個類都不能看到對方。

加載到不同的類加載器是如何Web容器,如Tomcat,Jetty等..隔離不同的Web應用程序。

另一種方法可能是設置自定義安全實現,但要比類加載器解決方案更難實現。

相關問題