程式碼品質不佳,會導致無法預料的行為。從使用者的角度來看,這通常表現為可用性不佳。對於攻擊者而言,這提供了以意想不到的方式向系統施加壓力的機會。
String
可能會導致資料遺失。String
時,未指定任何資料超出適用的字元集時將會發生什麼情況。這可導致資料遺失,或是當需要二進位資料來確保遵循正確的安全措施時,這可導致安全等級降低。
...
FileInputStream fis = new FileInputStream(myFile);
byte[] byteArr = byte[BUFSIZE];
...
int count = fis.read(byteArr);
...
String fileString = new String(byteArr);
String fileSHA256Hex = DigestUtils.sha256Hex(fileString);
// use fileSHA256Hex to validate file
...
BUFSIZE
,只要 myFile
中的資訊編碼方式與預設字元集相同,這就可以正常運作,但是如果使用的是不同的編碼,或是這是二進位檔案,將會遺失資料。這進而會導致產生的 SHA 雜湊較不可靠,並且可能表示,比較容易造成衝突,尤其是以相同的值 (例如問號) 表示超出預設字元集的任何資料時。NaN
進行比較一律是錯誤。NaN
進行比較時,一律會估算為 false
,除了 !=
運算子之外,這個運算子一律會估算為 true
,因為 NaN
處於未排序狀態。NaN
。
...
if (result == Double.NaN){
//something went wrong
throw new RuntimeException("Something went wrong, NaN found");
}
...
result
不是 NaN
,不過使用 ==
運算子搭配 NaN
一律會產生值 false
,因此這項檢查永不會拋出異常。inputReader
物件的輸入。如果一個攻擊者能提供執行惡意指令的 inputReader
實作,這個程式碼將無法區分物件是否為惡意版本。
if (inputReader.GetType().FullName == "CompanyX.Transaction.Monetary")
{
processTransaction(inputReader);
}
inputReader
物件的輸入。如果一個攻擊者能提供執行惡意指令的 inputReader
實作,這個程式碼將無法區分物件是否為惡意版本。
if (inputReader.getClass().getName().equals("com.example.TrustedClass")) {
input = inputReader.getInput();
...
}
inputReader
物件的輸入。如果一個攻擊者能提供執行惡意指令的 inputReader
實作,這個程式碼將無法區分物件是否為惡意版本。
if (inputReader::class.qualifiedName == "com.example.TrustedClass") {
input = inputReader.getInput()
...
}
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
區塊的此部分也是如此。