繼續對Fortify的漏洞進行總結,本篇主要針對 Portability Flaw: File Separator 和 Poor Error Handling: Return Inside Finally 漏洞進行總結,如下:
1、Portability Flaw: File Separator(文件分隔符)
1.1、產生原因:
不同的操作系統使用不同的字符作為文件分隔符。例如,Microsoft Windows 系統使用“\”,而 UNIX 系統則使用“/”。應用程序需要在不同的平台上運行時,使用硬編碼文件分隔符會導致應用程序邏輯執行錯誤,並有可能導致 denial of service(拒絕服務)。
例 1:以下代碼使用硬編碼文件分隔符來打開文件:
...
File file = new File(directoryName + "\\" + fileName);
1.2、修復方案:
為編寫可移植代碼,不應使用硬編碼文件分隔符,而應使用語言庫提供的獨立於平台的 API。
例 2:下列代碼執行與例 1 相同的功能,但使用獨立於平台的 API 來指定文件分隔符:
...
File file = new File(directoryName + File.separator + fileName);
...
2、Poor Error Handling: Return Inside Finally
2.1、產生原因:
finally 塊中的返回指令會導致從 try 塊中拋出的異常丟失。
例 1:在下列代碼中,調用 doMagic 方法,會導致拋出 Exception 異常,但該異常將不會傳遞給調用者,因為finally 塊中的返回指令會導致異常的丟棄。
public static void doMagic() throws Exception {
try {
throw new Exception(“Something error!”); //1.拋出異常
}catch(Exception e){ //2.捕獲異常匹配,進入控制塊
throw e;
}finally { //3.throw前控制轉移到finally塊,執行完后再返回
return true; //4.控制轉移,直接return,不再返回catch塊,吃掉了異常
}
}
2.2、修復方案:
將返回指令移到 finally 塊之外。如果必須要finally 塊返回一個值,可以簡單地將該返回值賦給一個本地變量,然后在 finally 塊執行完畢后返回該變量。
1、不要在finally里面寫return語句