Java 2 安全的存取控制異常狀況

Java™ 2 安全行為由其安全原則指定。 安全原則是存取控制矩陣,指定特定程式碼庫可以存取哪些系統資源,以及誰必須簽署它們。 Java 2 安全原則是宣告式的,由 java.security.AccessController.checkPermission 方法。

下列範例描述 java.security.AccessController.checkPermission 方法。 如需完整演算法,請參閱「安全: 學習資源」文章中的 Java 2 安全檢查許可權演算法。

i = m;
while (i> 0) {
if (caller i 的網域沒有許可權)
throw AccessControlException;
else if (caller i 標示為特許)
return;
i = i-1;
};

當 java.security.AccessController.checkPermission 方法,或拒絕要求及 java.security.AccessControlException 異常狀況。 不過,如果呼叫程式標示為特許,且類別 (呼叫程式) 獲授與這些許可權,則演算法會傳回且不會遍訪整個呼叫堆疊。 後續類別 (呼叫者) 不需要授與的必要許可權。

在 java.security.AccessController.checkPermission 方法期間,當呼叫堆疊上的某些類別遺漏必要的許可權時,會建立 java.security.AccessControlException 異常狀況。 兩個可能的 java.security.AccessControlException 異常狀況如下:
  • 如果應用程式正在呼叫 Java 2 安全保護的應用程式設計介面 (API) ,請授與應用程式 Java 2 安全原則的必要許可權。 如果應用程式不是直接呼叫 Java 2 安全保護的 API ,則存取 Java 2 安全保護資源的協力廠商 API 會產生副作用。
  • 如果授與應用程式必要的許可權,它會獲得比需要更多的存取權。 在此情況下,存取 Java 2 安全保護資源的協力廠商程式碼可能未適當地標示為特許。

範例呼叫堆疊

此呼叫堆疊範例指出應用程式碼使用協力廠商 API 公用程式程式庫來更新密碼的位置。 下列範例呈現來說明該點。 將程式碼標示為特許的位置決策是應用程式特有的,在每一種狀況下都是唯一的。 這項決定需要極深入的領域知識和安全專門知識,才能作出正確的判斷。 本主題提供了許多撰寫得好的出版物和書籍。 建議參照這些資料,以取得更詳細的資訊。
此呼叫堆疊範例指出應用程式碼使用協力廠商 API 公用程式程式庫來更新密碼的位置。 下列範例呈現來說明該點。 將程式碼標示為特許的位置決策是應用程式特有的,在每一種狀況下都是唯一的。 這項決定需要極深入的領域知識和安全專門知識,才能作出正確的判斷。

您可以使用 PasswordUtil 公用程式來變更使用者的密碼。 公用程式會鍵入舊密碼和新密碼兩次,以確保輸入正確的密碼。 如果舊密碼符合密碼檔中儲存的密碼,則會儲存新密碼並更新密碼檔。 假設沒有任何堆疊框標示為特許。 根據 java.security.AccessController.checkPermission 演算法,除非將密碼檔的寫入權授與呼叫堆疊上的所有類別,否則應用程式會失敗。 用戶端應用程式無權直接寫入密碼檔,也無權隨便更新密碼檔。

不過,如果 PasswordUtil.updatePassword檔案方法將存取密碼檔的程式碼標示為特許,只要 PasswordUtil 類別獲得許可權,檢查許可權演算法就不會檢查呼叫 thePasswordUtil.updatePasswordFile 方法之類別中的必要許可權。 用戶端應用程式可以順利更新密碼,而無需授與寫入密碼檔的許可權。

將程式碼標示為特許的能力非常靈活且強大。 如果不正確地使用此能力,則系統的整體安全可能會受損,且可能會暴露安全漏洞。 請謹慎使用將程式碼標示為特許的能力。

java.security.AccessControlException 異常狀況

如先前所述,您有兩種方法來解析 java.security.AccessControlException 異常狀況。 請個別判斷這些例外情況,以決定下列哪一項決議是最佳的:
  1. 請授與遺漏的應用程式許可權。
  2. 在考量問題及風險之後,將部分程式碼標示為特許。