首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 類載入機制與類庫優先順序:破解與防範

     編輯:Java 相關知識

類載入優先順序

JVM 載入類遵循雙親委派模型,優先順序由高到低:

  1. Bootstrap ClassLoader (啟動類載入器) - 核心庫 rt.jar
  2. Extension ClassLoader (擴展類載入器) - jre/lib/ext/*.jar
  3. Application ClassLoader (應用類載入器) - classpath 指定路徑
  4. Custom ClassLoader (自定義類載入器) - 開發者定義

同一個類只會被載入一次,**先載入者勝出**,後續同名同包類會被忽略。

實驗:類庫優先載入導致的「破解」現象

步驟 1:製作惡意 Jar (kj021320.jar)

package cn.isto;
public class Jcrack {
    public boolean getLogin(String pwd) { return true; } // 直接通過
}

步驟 2:正常應用程式

package cn.isto;
public class Jcrack {
    public boolean getLogin(String pwd) { return "KJ021320".equals(pwd); }
}

public class JMain {
    public static void main(String[] args) {
        System.out.println(new Jcrack().getLogin("Summer")); // false
    }
}

步驟 3:將惡意 Jar 放入 classpath 最前端

執行 java -cp kj021320.jar:. JMain → 輸出 true!

原因:JVM 先從 kj021320.jar 載入 cn.isto.Jcrack,應用程式同名類被捨棄。

安全啟示與防範

  • 簽名驗證:對關鍵 Jar 簽名,啟動時驗證簽名完整性
  • 封裝保護:關鍵類放入不可輕易替換的模組 (如 JPMS 模組、加密 Jar)
  • 類載入器隔離:使用自定義 ClassLoader 建立隔離命名空間
  • 完整性檢查:啟動時計算關鍵類雜湊值與基準比對
  • 避免 classpath 污染:生產環境嚴格控制 classpath 順序,不信任外部輸入

包機制補充

package 權限 (default) 僅對同一類載入器載入的同包類可見。Bootstrap 載入 java.lang.String,Application 載入自寫 java.lang.Test,雖同包但不同載入器,無法互訪 package 私有成員,有效防範惡意代碼竊取核心類內部狀態。

結語

理解類載入順序與雙親委派模型,不僅能解释類衝突、熱部署、模組化等現象,更是構建安全 Java 應用的基礎。**永遠不要信任 classpath 的不可變性**,關鍵路徑務必加固。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved