雖然客戶仍然很關心您為他們構建的應用程序的可伸縮性和可用性,但他們可能變得也很關心安全性,而且要求非凡嚴格。應用程序可能輕易受到兩類安全性威脅的攻擊:靜態和動態。雖然開發人員不能完全控制動態威脅,但在開發應用程序時,您可以采取一些預防措施來消除靜態威脅。本文概括并解釋了 13 種類型的靜態暴露 ― 它們是系統中的缺陷,它使系統暴露在想要篡奪該系統的特權的攻擊者面前。您將學會如何處理這些暴露,以及如何發現(假如不處理這些暴露)這些暴露可能造成的影響。
在開發 java Web 應用程序時,您需要確保應用程序擁有完善的安全性特征補充。這里在談到 Java 安全性時,我們并不談及 Java 語言提供的安全性 API,也不涉及使用 Java 代碼來保護應用程序。本文將著重討論可能潛伏在您的 Java 應用程序中的 安全性暴露。安全性暴露是系統中的缺陷,它使系統無法 ― 即使系統被正常使用 ― 防止攻擊者篡奪對系統的特權、控制系統的運行、危及系統上的數據安全或者假冒未經授權的信任。相對于安全性暴露,許多開發人員更加關心網站的感官效果。
毫無疑問,客戶現在既嚴格地關注性能、可伸縮性和可用性也嚴格地關注安全性。應用程序可能輕易受到兩類安全性威脅的攻擊: 動態和 靜態。動態威脅是那些同未經授權進入系統有關的威脅,或那些同跨越網絡傳輸的數據的完整性、隱私和機密性有關的威脅。這些威脅同應用程序的功能代碼沒有多大關系;使用加密、加密術和認證技術來消除這些威脅。相比之下,靜態威脅卻同應用程序的功能代碼 有關;它們同進入系統的授權用戶所做的事情有關。未知用戶闖入系統是動態威脅的一個示例;授權用戶以未授權方式操作系統內的代碼或數據是靜態威脅的示例。應用程序開發人員并不能完全控制動態威脅;但開發人員在構建應用程序時卻可以采取預防措施來消除靜態威脅。
在本文中,我們討論了對付 13 種不同靜態暴露的技巧。對于每種暴露,我們解釋了不處理這些安全性問題所造成的影響。我們還為您推薦了一些準則,要開發不受這些靜態安全性暴露威脅的、健壯且安全的 Java 應用程序,您應該遵循這些準則。一有合適的時機,我們就提供代碼樣本(既有暴露的代碼也有無暴露的代碼)。
對付高嚴重性暴露的技巧
請遵循下列建議以避免高嚴重性靜態安全性暴露:
·限制對變量的訪問
·讓每個類和方法都成為 final,除非有足夠的理由不這樣做
·不要依靠包作用域
·使類不可克隆
·使類不可序列化
·使類不可逆序列化
·避免硬編碼敏感數據
·查找惡意代碼
限制對變量的訪問
假如將變量聲明為 public,那么外部代碼就可以操作該變量。這可能會導致安全性暴露。
影響
假如實例變量為 public ,那么就可以在類實例上直接訪問和操作該實例變量。將實例變量聲明為 PRotected 并不一定能解決這一問題:雖然不可能直接在類實例基礎上訪問這樣的變量,但仍然可以從派生類訪問這個變量。
清單 1 演示了帶有 public 變量的代碼,因為變量為 public 的,所以它暴露了。
清單 1. 帶有 public 變量的代碼
class Test {
public int id;
protected String name;
Test(){
id = 1;
name = "hello world";
}
//code
}
public class MyClass extends Test{
public void methodIllegalSet(String name){
this.name = name; // this should not be allowed
}
public static void main(String[] args){
Test obj = new Test();
obj.id = 123; // this should not be allowed
MyClass mc = new MyClass();
mc.methodIllegalSet("Illegal Set Value");
}
}
建議
一般來說,應該使用取值方法而不是 public 變量。按照具體問題具體對待的原則,在確定哪些變量非凡重要因而應該聲明為 private 時,請將編碼的方便程度及成本同安全性需要加以比較。清單 2 演示了以下列方式來使之安全的代碼:
清單 2. 不帶有 public 變量的代碼
class Test {
private int id;
private String name;
Test(){
id = 1;
name = "hello world";
}
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}
新聞熱點
疑難解答