代碼遠程下載執行帶來竊取、竄改、破壞、盜用資源風險。Java 採用**內建安全模型**,隨版本演進:
| 版本 | 里程碑 |
|---|---|
| JDK 1.0 | 基本沙箱 |
| JDK 1.1 | 代碼簽名與認證 |
| JDK 1.2 | 細粒度訪問控制 |
keytool -genkeypairjar cvf app.jar ...jarsigner -keystore ks -signedjar signed.jar app.jar alias
Policy (抽象) → 具體實現如 FilePolicy
│
├─ CodeSource → URL (代碼來源) + Certificate[] (簽名者)
│
└─ PermissionCollection → Permission[] (權限集合)
│
├─ FilePermission → path, actions (read,write,delete,execute)
├─ SocketPermission → host:port, actions (connect,accept,listen,resolve)
├─ RuntimePermission → name (exitVM, createClassLoader, ...)
└─ ... (可自定義)
grant codeBase "https://trusted.example.com/-" {
permission java.io.FilePermission "/data/app/-", "read,write";
permission java.net.SocketPermission "db.example.com:3306", "connect";
};
grant signedBy "duke" {
permission java.util.PropertyPermission "user.dir", "read";
};
// 應用代碼
File f = new File("/etc/passwd");
f.read(); // 內部呼叫 SecurityManager.checkRead("/etc/passwd")
// SecurityManager 默認實現
public void checkRead(String file) {
checkPermission(new FilePermission(file, "read"));
}
public void checkPermission(Permission perm) {
AccessController.checkPermission(perm); // 委託給 AccessController
}
// AccessController
// 1. 取得當前調用鏈所有 ProtectionDomain
// 2. 從 Policy 查詢每個 Domain 的 PermissionCollection
// 3. 若所有 Domain 都隱含 perm → 通過,否則拋 AccessControlException
-Djava.security.manager從粗糙沙箱到聲明式細粒度授權,Java 安全模型歷經三代演進,構建起「驗證→信任→授權」完整防線,為企業級應用安全奠基。