雖然客戶仍然很關(guān)心您為他們構(gòu)建的應(yīng)用程序的可伸縮性和可用性,但他們可能變得也很關(guān)心安全性,而且要求非凡嚴(yán)格。應(yīng)用程序可能輕易受到兩類安全性威脅的攻擊:靜態(tài)和動(dòng)態(tài)。雖然開發(fā)人員不能完全控制動(dòng)態(tài)威脅,但在開發(fā)應(yīng)用程序時(shí),您可以采取一些預(yù)防措施來消除靜態(tài)威脅。本文概括并解釋了 13 種類型的靜態(tài)暴露 ― 它們是系統(tǒng)中的缺陷,它使系統(tǒng)暴露在想要篡奪該系統(tǒng)的特權(quán)的攻擊者面前。您將學(xué)會(huì)如何處理這些暴露,以及如何發(fā)現(xiàn)(假如不處理這些暴露)這些暴露可能造成的影響。
在開發(fā) java Web 應(yīng)用程序時(shí),您需要確保應(yīng)用程序擁有完善的安全性特征補(bǔ)充。這里在談到 Java 安全性時(shí),我們并不談及 Java 語言提供的安全性 API,也不涉及使用 Java 代碼來保護(hù)應(yīng)用程序。本文將著重討論可能潛伏在您的 Java 應(yīng)用程序中的 安全性暴露。安全性暴露是系統(tǒng)中的缺陷,它使系統(tǒng)無法 ― 即使系統(tǒng)被正常使用 ― 防止攻擊者篡奪對(duì)系統(tǒng)的特權(quán)、控制系統(tǒng)的運(yùn)行、危及系統(tǒng)上的數(shù)據(jù)安全或者假冒未經(jīng)授權(quán)的信任。相對(duì)于安全性暴露,許多開發(fā)人員更加關(guān)心網(wǎng)站的感官效果。
毫無疑問,客戶現(xiàn)在既嚴(yán)格地關(guān)注性能、可伸縮性和可用性也嚴(yán)格地關(guān)注安全性。應(yīng)用程序可能輕易受到兩類安全性威脅的攻擊: 動(dòng)態(tài)和 靜態(tài)。動(dòng)態(tài)威脅是那些同未經(jīng)授權(quán)進(jìn)入系統(tǒng)有關(guān)的威脅,或那些同跨越網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)的完整性、隱私和機(jī)密性有關(guān)的威脅。這些威脅同應(yīng)用程序的功能代碼沒有多大關(guān)系;使用加密、加密術(shù)和認(rèn)證技術(shù)來消除這些威脅。相比之下,靜態(tài)威脅卻同應(yīng)用程序的功能代碼 有關(guān);它們同進(jìn)入系統(tǒng)的授權(quán)用戶所做的事情有關(guān)。未知用戶闖入系統(tǒng)是動(dòng)態(tài)威脅的一個(gè)示例;授權(quán)用戶以未授權(quán)方式操作系統(tǒng)內(nèi)的代碼或數(shù)據(jù)是靜態(tài)威脅的示例。應(yīng)用程序開發(fā)人員并不能完全控制動(dòng)態(tài)威脅;但開發(fā)人員在構(gòu)建應(yīng)用程序時(shí)卻可以采取預(yù)防措施來消除靜態(tài)威脅。
在本文中,我們討論了對(duì)付 13 種不同靜態(tài)暴露的技巧。對(duì)于每種暴露,我們解釋了不處理這些安全性問題所造成的影響。我們還為您推薦了一些準(zhǔn)則,要開發(fā)不受這些靜態(tài)安全性暴露威脅的、健壯且安全的 Java 應(yīng)用程序,您應(yīng)該遵循這些準(zhǔn)則。一有合適的時(shí)機(jī),我們就提供代碼樣本(既有暴露的代碼也有無暴露的代碼)。
對(duì)付高嚴(yán)重性暴露的技巧
請(qǐng)遵循下列建議以避免高嚴(yán)重性靜態(tài)安全性暴露:
·限制對(duì)變量的訪問
·讓每個(gè)類和方法都成為 final,除非有足夠的理由不這樣做
·不要依靠包作用域
·使類不可克隆
·使類不可序列化
·使類不可逆序列化
·避免硬編碼敏感數(shù)據(jù)
·查找惡意代碼
限制對(duì)變量的訪問
假如將變量聲明為 public,那么外部代碼就可以操作該變量。這可能會(huì)導(dǎo)致安全性暴露。
影響
假如實(shí)例變量為 public ,那么就可以在類實(shí)例上直接訪問和操作該實(shí)例變量。將實(shí)例變量聲明為 PRotected 并不一定能解決這一問題:雖然不可能直接在類實(shí)例基礎(chǔ)上訪問這樣的變量,但仍然可以從派生類訪問這個(gè)變量。
清單 1 演示了帶有 public 變量的代碼,因?yàn)樽兞繛?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");
}
}
建議
一般來說,應(yīng)該使用取值方法而不是 public 變量。按照具體問題具體對(duì)待的原則,在確定哪些變量非凡重要因而應(yīng)該聲明為 private 時(shí),請(qǐng)將編碼的方便程度及成本同安全性需要加以比較。清單 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;
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注