界: Code Quality
程式碼品質不佳,會導致無法預料的行為。從使用者的角度來看,這通常表現為可用性不佳。對於攻擊者而言,這提供了以意想不到的方式向系統施加壓力的機會。
Code Correctness: Hidden Method
Abstract
靜態方法是無法取代的,但是在做為實例方法被呼叫時,可能會隱藏起來。
Explanation
靜態方法無法使用定義加以取代,因為它們屬於該類別實例以外的類別。雖然在一些案例中,似乎已在子類別中取代靜態方法,但是這可能導致衝突,並可導致要呼叫的方法的版本不正確。
範例 1:以下會嘗試定義 API 以驗證使用者。
乍看之下,此程式碼似乎正常。但是,由於我們將針對
範例 1:以下會嘗試定義 API 以驗證使用者。
class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
乍看之下,此程式碼似乎正常。但是,由於我們將針對
user
實例 (而不是針對 User
或 RegularUser
類別) 呼叫 getAccessLevel()
方法,因此這將意味著,此狀況一律會傳回 true
,並且會執行限制的操作,即使使用 instanceof
以進入 if/else
區塊的此部分也是如此。References
desc.structural.java.code_correctness_hidden_method