資安JAVA(二九): Manage Resources

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 29 – MANAGE RESOURCES
作者:John Melton
What is it and why should I care?
用完後記得將工具歸位喔。
資源管理長久以來都是程式設計中一個重要議題,而且跟資安三大目標CIA中的Availability更是息息相關。資源管理好壞影響著你存取時系統是否順利的回傳,故你不會隨意的釋放相關資源(硬碟空間、記憶體、網路連線等等)。

雖然不像是因為使用者帳戶和密碼的加密機制過於簡單(像是 ROT-13)而被破解一樣受人注目,但是資源洩漏造成的系統當機也頗為尷尬。不良的資源管理機制將導致系統崩潰、不穩定。若你剛好是每天凌晨兩點因為機器崩潰被主管狂 call 的工程師,那你應該懂我的意思。

What should I do about it?

為了防止資源不當洩漏,你應該要好好規劃如何的釋放你不需要的資源。但在 JAVA 的世界又是另外一回事。

1. 用 finally 來控制

傳統的結束使用資源的方法就是用 JAVA 中的 finally 語句。這是相對簡單直接的流程,以下為範例:

BufferedReader bufferedReader = null;
FileReader fileReader = null;
try {
 String line;
 fileReader = new FileReader("/tmp/myfile.txt");
 bufferedReader = new BufferedReader(fileReader);

 while((line = bufferedReader.readLine()) != null) {
  System.out.println(line);
 }
} catch(Exception e1) {
 e1.printStackTrace();
} finally {
 if(fileReader != null) {
  try {
   fileReader.close();
  } catch(Exception e2) {
   e2.printStackTrace();
  }
 }

 if(bufferedReader != null) {
  try {
   bufferedReader.close();
  } catch (Exception e2) {
   e2.printStackTrace();
  }
 }
}


我們所做的是讀取一個檔案,然後印出每一行文字。如果你將整理一下這個 method,增加傳入的參數和回傳的結果,就可重複利用在需要讀取檔案的程式。就像是許多檔案讀取 method。

2. try-with-resources

為什麼用完之後沒有釋放資源?恩,我想是因為複製他人不好的、懶惰的程式碼,以至於你忽略釋放資源。要是成是語言本身就能夠自動執行這個工作該多好呀。燈燈,剛好在 Java 7
 ,經過所有人不斷苦苦哀求,終於新增了 try with 。Try with 只能用在 Java 7 以下的版本,它的好處是讓語言本身去管理資源釋放,以下為範例:

try (FileReader fileReader = = new FileReader("/tmp/myfile.txt");BufferedReader bufferedReader = new BufferedReader(fileReader)) {
  String line;
  while((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
    }
} catch (Exception e) {
  e.printStackTrace();
}


Try with 的陳述語句讓程式碼更精簡,寫程式的時候精簡好懂是很重要的。

3. 利用函式庫來管理

HibernateSpring 對於資料庫存取有不錯的幫助,即使是照著 framework 建議設定就可以更有效的存取和釋放資源。除此之外,還有許多應用程式中和資源釋放有關的函式庫(例如:FileUtils, StreamUtils, DbUtils)。如果你能利用這些工具,則你的應用程式將更棒。釋放資源常常是大家不會注意的細節,但是他會影響應用程式的穩定性。Java 中管理資源是很容易的。

參考資料
———–
http://www.mkyong.com/java/try-with-resources-example-in-jdk-7/
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
http://caterpillar.onlyfun.net/Gossip/HibernateGossip/HibernateGossip.html
http://caterpillar.onlyfun.net/Gossip/SpringGossip/SpringGossip.html


———–———–
資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(八):HTTP強制傳輸安全(HSTS)

以 SharpPcap 實作可收聽封包的 C# 程式

資安JAVA(四):Session Cookie HTTPOnly Flag