2009-06-13 61 views
3

我想給我的jdk6\jre\lib\security\java.policy文件添加一個阻止來創建一些被appengine列入黑名單的類。例如,我希望我的本地jvm在應用程序嘗試實例化javax.naming.NamingException時拋出異常。我可以通過配置java.policy文件來拒絕對jvm類的訪問嗎?

有可能嗎?

我會盡力在這裏解釋我的具體問題。 Google提供的服務(GAE-google應用程序引擎)對哪些類可以使用有一些限制。例如,不會實例化javax.naming包中的JNDI類。他們還提供了一個測試服務器,可以用來在我的機器上測試這個應用程序,但是這個服務器允許這樣的類並且可以代碼清晰。您只有在將應用程序上傳到Google後纔會發現您使用了黑名單課程。我在想如果這樣的類黑名單強制執行不能在開發jvm上完成。否則我認爲這很容易,他們可能已經提供了這樣的政策文件。

+2

將白名單列入黑名單。 – 2010-03-03 02:19:03

回答

6

您可以編寫一個小型加載程序應用程序,該應用程序創建一個new, custom classloader。然後可以使用這個類加載器加載你的應用程序類。

在自定義類加載器中,您可以在應用程序試圖訪問您想要黑名單的類時引發ClassNotFoundException。

您將需要重載load()方法。如果類允許,這個方法將負責在列入黑名單的類上拋出異常或者轉到父類加載器。實現示例:

public Class loadClass(String name) throws ClassNotFoundException { 
    if(name.equals("javax.lang.ClassIDontLike")){ 
     throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that."); 
    } 
    return super.loadClass(name, false); 
} 

(當然,真正的實現可能的方式比這更復雜)

因爲你的應用程序的類通過這個類加載器加載,而你只委派的loadClass( )在需要時調用父類加載器,您可以將您需要的任何類加入黑名單。

我確定這是Google用來在其服務器中將類黑名單的方法。它們加載特定類加載器中的每個應用程序。這也與Tomcat隔離不同Web應用程序的方式類似。

+1

我覺得Class.forName()可能會繞過一個自定義類加載器,然後直接進入引導/系統類加載。我認爲有命令行參數可以替換引導類加載器,也可能要查看它。 – basszero 2009-06-17 14:59:54

0

Java文檔列出了所有可能的政策權限的位置:沒有提到 http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

創建類/加載,所以我相信使用策略,你不能強制這一點。

無論如何,你爲什麼要在加載異常類時拋出異常呢?也許你可以解釋你的問題,然後有人可能會提出解決方案。

編輯:防止某些類型的負載會從JRE安裝中刪除他們

的一種方式。大多數系統類都包含在JDK/JRE安裝中的rt.jar中。你應該可以用任何ZIP工具修改它。

只需創建JRE的特殊安裝,並修改其rt.jar。這是一個醜陋的黑客攻擊,但應該可以用於測試目的...

1

在測試程序時,你寧願得到比運行時錯誤更多的編譯錯誤嗎?您可以配置您的IDE或編譯器,以在不需要的類實例化時發出警告。我知道AspectJ有一些很好的功能:您可以在連接點上定義編譯警告/錯誤,並在例如蝕。要在Eclipse中使用它,只需安裝AspectJ插件並編寫一個合適的方面。要從命令行或腳本編譯時得到錯誤,你實際上必須使用AspectJ編譯器,但我懷疑你會需要它。