真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

社區(qū)人員信息java代碼 社區(qū)人員信息java代碼

怎么樣才能寫(xiě)出安全的Java代碼?不被黑客攻擊?

在本文中,我們討論了對(duì)付 13 種不同靜態(tài)暴露的技巧。對(duì)于每種暴露,我們解釋了不處理這些安全性問(wèn)題所造成的影響。我們還為您推薦了一些準(zhǔn)則,要開(kāi)發(fā)不受這些靜態(tài)安全性暴露威脅的、健壯且安全的 Java 應(yīng)用程序,您應(yīng)該遵循這些準(zhǔn)則。一有合適的時(shí)機(jī),我們就提供代碼樣本(既有暴露的代碼也有無(wú)暴露的代碼)。

創(chuàng)新互聯(lián)長(zhǎng)期為上千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為平原企業(yè)提供專(zhuān)業(yè)的做網(wǎng)站、成都網(wǎng)站建設(shè),平原網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

對(duì)付高嚴(yán)重性暴露的技巧

請(qǐng)遵循下列建議以避免高嚴(yán)重性靜態(tài)安全性暴露:

限制對(duì)變量的訪問(wèn)

讓每個(gè)類(lèi)和方法都成為 final,除非有足夠的理由不這樣做

不要依賴(lài)包作用域

使類(lèi)不可克隆

使類(lèi)不可序列化

使類(lèi)不可逆序列化

避免硬編碼敏感數(shù)據(jù)

查找惡意代碼

限制對(duì)變量的訪問(wèn)

如果將變量聲明為 public,那么外部代碼就可以操作該變量。這可能會(huì)導(dǎo)致安全性暴露。

影響

如果實(shí)例變量為 public,那么就可以在類(lèi)實(shí)例上直接訪問(wèn)和操作該實(shí)例變量。將實(shí)例變量聲明為 protected 并不一定能解決這一問(wèn)題:雖然不可能直接在類(lèi)實(shí)例基礎(chǔ)上訪問(wèn)這樣的變量,但仍然可以從派生類(lèi)訪問(wèn)這個(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");

}

}

建議

一般來(lái)說(shuō),應(yīng)該使用取值方法而不是 public 變量。按照具體問(wèn)題具體對(duì)待的原則,在確定哪些變量特別重要因而應(yīng)該聲明為 private 時(shí),請(qǐng)將編碼的方便程度及成本同安全性需要加以比較。清單 2 演示了以下列方式來(lái)使之安全的代碼:

清單 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;

}

}

讓每個(gè)類(lèi)和方法都為 final

不允許擴(kuò)展的類(lèi)和方法應(yīng)該聲明為 final。這樣做防止了系統(tǒng)外的代碼擴(kuò)展類(lèi)并修改類(lèi)的行為。

影響

僅僅將類(lèi)聲明為非 public 并不能防止攻擊者擴(kuò)展類(lèi),因?yàn)槿匀豢梢詮乃约旱陌鼉?nèi)訪問(wèn)該類(lèi)。

建議

讓每個(gè)類(lèi)和方法都成為 final,除非有足夠的理由不這樣做。按此建議,我們要求您放棄可擴(kuò)展性,雖然它是使用諸如 Java 語(yǔ)言之類(lèi)的面向?qū)ο笳Z(yǔ)言的主要優(yōu)點(diǎn)之一。在試圖提供安全性時(shí),可擴(kuò)展性卻成了您的敵人;可擴(kuò)展性只會(huì)為攻擊者提供更多給您帶來(lái)麻煩的方法。

不要依賴(lài)包作用域

沒(méi)有顯式地標(biāo)注為 public、private 或 protected 的類(lèi)、方法和變量在它們自己的包內(nèi)是可訪問(wèn)的。

影響

如果 Java 包不是封閉的,那么攻擊者就可以向包內(nèi)引入新類(lèi)并使用該新類(lèi)來(lái)訪問(wèn)您想保護(hù)的內(nèi)容。諸如 java.lang 之類(lèi)的一些包缺省是封閉的,一些 JVM 也讓您封閉自己的包。然而,您最好假定包是不封閉的。

建議

從軟件工程觀點(diǎn)來(lái)看,包作用域具有重要意義,因?yàn)樗梢宰柚箤?duì)您想隱藏的內(nèi)容進(jìn)行偶然的、無(wú)意中的訪問(wèn)。但不要依靠它來(lái)獲取安全性。應(yīng)該將類(lèi)、方法和變量顯式標(biāo)注為 public、private 或 protected 中適合您特定需求的那種。

使類(lèi)不可克隆

克隆允許繞過(guò)構(gòu)造器而輕易地復(fù)制類(lèi)實(shí)例。

影響

即使您沒(méi)有有意使類(lèi)可克隆,外部源仍然可以定義您的類(lèi)的子類(lèi),并使該子類(lèi)實(shí)現(xiàn) java.lang.Cloneable。這就讓攻擊者創(chuàng)建了您的類(lèi)的新實(shí)例??截惉F(xiàn)有對(duì)象的內(nèi)存映象生成了新的實(shí)例;雖然這樣做有時(shí)候是生成新對(duì)象的可接受方法,但是大多數(shù)時(shí)候是不可接受的。清單 3 說(shuō)明了因?yàn)榭煽寺《┞兜拇a:

清單 3. 可克隆代碼

class MyClass{

private int id;

private String name;

public MyClass(){

id=1;

name="HaryPorter";

}

public MyClass(int id,String name){

this.id=id;

this.name=name;

}

public void display(){

System.out.println("Id ="+id+"

"+"Name="+name);

}

}

// hackers code to clone the user class

public class Hacker extends MyClass implements Cloneable {

public static void main(String[] args){

Hacker hack=new Hacker();

try{

MyClass o=(MyClass)hack.clone();

o.display();

}

catch(CloneNotSupportedException e){

e.printStackTrace();

}

}

}

建議

要防止類(lèi)被克隆,可以將清單 4 中所示的方法添加到您的類(lèi)中:

清單 4. 使您的代碼不可克隆

public final Object clone()

throws java.lang.CloneNotSupportedException{

throw new java.lang.CloneNotSupportedException();

}

如果想讓您的類(lèi)可克隆并且您已經(jīng)考慮了這一選擇的后果,那么您仍然可以保護(hù)您的類(lèi)。要做到這一點(diǎn),請(qǐng)?jiān)谀念?lèi)中定義一個(gè)為 final 的克隆方法,并讓它依賴(lài)于您的一個(gè)超類(lèi)中的一個(gè)非 final 克隆方法,如清單 5 中所示:

清單 5. 以安全的方式使您的代碼可克隆

public final Object clone()

throws java.lang.CloneNotSupportedException {

super.clone();

}

類(lèi)中出現(xiàn) clone() 方法防止攻擊者重新定義您的 clone 方法。

使類(lèi)不可序列化

序列化允許將類(lèi)實(shí)例中的數(shù)據(jù)保存在外部文件中。闖入代碼可以克隆或復(fù)制實(shí)例,然后對(duì)它進(jìn)行序列化。

影響

序列化是令人擔(dān)憂(yōu)的,因?yàn)樗试S外部源獲取對(duì)您的對(duì)象的內(nèi)部狀態(tài)的控制。這一外部源可以將您的對(duì)象之一序列化成攻擊者隨后可以讀取的字節(jié)數(shù)組,這使得攻擊者可以完全審查您的對(duì)象的內(nèi)部狀態(tài),包括您標(biāo)記為 private 的任何字段。它也允許攻擊者訪問(wèn)您引用的任何對(duì)象的內(nèi)部狀態(tài)。

建議

要防止類(lèi)中的對(duì)象被序列化,請(qǐng)?jiān)陬?lèi)中定義清單 6 中的 writeObject() 方法:

清單 6. 防止對(duì)象序列化

private final void writeObject(ObjectOutputStream out)

throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot

be serialized");

}

通過(guò)將 writeObject() 方法聲明為 final,防止了攻擊者覆蓋該方法。

使類(lèi)不可逆序列化

通過(guò)使用逆序列化,攻擊者可以用外部數(shù)據(jù)或字節(jié)流來(lái)實(shí)例化類(lèi)。

影響

不管類(lèi)是否可以序列化,都可以對(duì)它進(jìn)行逆序列化。外部源可以創(chuàng)建逆序列化成類(lèi)實(shí)例的字節(jié)序列。這種可能為您帶來(lái)了大量風(fēng)險(xiǎn),因?yàn)槟荒芸刂颇嫘蛄谢瘜?duì)象的狀態(tài)。請(qǐng)將逆序列化作為您的對(duì)象的另一種公共構(gòu)造器 — 一種您無(wú)法控制的構(gòu)造器。

建議

要防止對(duì)對(duì)象的逆序列化,應(yīng)該在您的類(lèi)中定義清單 7 中的 readObject() 方法:

清單 7. 防止對(duì)象逆序列化

private final void readObject(ObjectInputStream in)

throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot

be deserialized");

}

通過(guò)將該方法聲明為 final,防止了攻擊者覆蓋該方法。

避免硬編碼敏感數(shù)據(jù)

您可能會(huì)嘗試將諸如加密密鑰之類(lèi)的秘密存放在您的應(yīng)用程序或庫(kù)的代碼。對(duì)于你們開(kāi)發(fā)人員來(lái)說(shuō),這樣做通常會(huì)把事情變得更簡(jiǎn)單。

影響

任何運(yùn)行您的代碼的人都可以完全訪問(wèn)以這種方法存儲(chǔ)的秘密。沒(méi)有什么東西可以防止心懷叵測(cè)的程序員或虛擬機(jī)窺探您的代碼并了解其秘密。

建議

可以以一種只可被您解密的方式將秘密存儲(chǔ)在您代碼中。在這種情形下,秘密只在于您的代碼所使用的算法。這樣做沒(méi)有多大壞處,但不要洋洋得意,認(rèn)為這樣做提供了牢固的保護(hù)。您可以遮掩您的源代碼或字節(jié)碼 — 也就是,以一種為了解密必須知道加密格式的方法對(duì)源代碼或字節(jié)碼進(jìn)行加密 — 但攻擊者極有可能能夠推斷出加密格式,對(duì)遮掩的代碼進(jìn)行逆向工程從而揭露其秘密。

這一問(wèn)題的一種可能解決方案是:將敏感數(shù)據(jù)保存在屬性文件中,無(wú)論什么時(shí)候需要這些數(shù)據(jù),都可以從該文件讀取。如果數(shù)據(jù)極其敏感,那么在訪問(wèn)屬性文件時(shí),您的應(yīng)用程序應(yīng)該使用一些加密/解密技術(shù)。

查找惡意代碼

從事某個(gè)項(xiàng)目的某個(gè)心懷叵測(cè)的開(kāi)發(fā)人員可能故意引入易受攻擊的代碼,打算日后利用它。這樣的代碼在初始化時(shí)可能會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程,該進(jìn)程可以為闖入者開(kāi)后門(mén)。它也可以更改一些敏感數(shù)據(jù)。

這樣的惡意代碼有三類(lèi):

類(lèi)中的 main 方法

定義過(guò)且未使用的方法

注釋中的死代碼

影響

入口點(diǎn)程序可能很危險(xiǎn)而且有惡意。通常,Java 開(kāi)發(fā)人員往往在其類(lèi)中編寫(xiě) main() 方法,這有助于測(cè)試單個(gè)類(lèi)的功能。當(dāng)類(lèi)從測(cè)試轉(zhuǎn)移到生產(chǎn)環(huán)境時(shí),帶有 main() 方法的類(lèi)就成為了對(duì)應(yīng)用程序的潛在威脅,因?yàn)殛J入者將它們用作入口點(diǎn)。

請(qǐng)檢查代碼中是否有未使用的方法出現(xiàn)。這些方法在測(cè)試期間將會(huì)通過(guò)所有的安全檢查,因?yàn)樵诖a中不調(diào)用它們 — 但它們可能含有硬編碼在它們內(nèi)部的敏感數(shù)據(jù)(雖然是測(cè)試數(shù)據(jù))。引入一小段代碼的攻擊者隨后可能調(diào)用這樣的方法。

避免最終應(yīng)用程序中的死代碼(注釋內(nèi)的代碼)。如果闖入者去掉了對(duì)這樣的代碼的注釋?zhuān)敲创a可能會(huì)影響系統(tǒng)的功能性。

可以在清單 8 中看到所有三種類(lèi)型的惡意代碼的示例:

清單 8. 潛在惡意的 Java 代碼

public void unusedMethod(){

// code written to harm the system

}

public void usedMethod(){

//unusedMethod(); //code in comment put with bad intentions,

//might affect the system if uncommented

// int x = 100;

// x=x+10; //Code in comment, might affect the

//functionality of the system if uncommented

}

建議

應(yīng)該將(除啟動(dòng)應(yīng)用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代碼從應(yīng)用程序代碼中除去。在軟件交付使用之前,主要開(kāi)發(fā)人員應(yīng)該對(duì)敏感應(yīng)用程序進(jìn)行一次全面的代碼評(píng)審。應(yīng)該使用“Stub”或“dummy”類(lèi)代替 main() 方法以測(cè)試應(yīng)用程序的功能。

對(duì)付中等嚴(yán)重性暴露的技巧

請(qǐng)遵循下列建議以避免中等嚴(yán)重性靜態(tài)安全性暴露:

不要依賴(lài)初始化

不要通過(guò)名稱(chēng)來(lái)比較類(lèi)

不要使用內(nèi)部類(lèi)

不要依賴(lài)初始化

您可以不運(yùn)行構(gòu)造器而分配對(duì)象。這些對(duì)象使用起來(lái)不安全,因?yàn)樗鼈儾皇峭ㄟ^(guò)構(gòu)造器初始化的。

影響

在初始化時(shí)驗(yàn)證對(duì)象確保了數(shù)據(jù)的完整性。

例如,請(qǐng)想象為客戶(hù)創(chuàng)建新帳戶(hù)的 Account 對(duì)象。只有在 Account 期初余額大于 0 時(shí),才可以開(kāi)設(shè)新帳戶(hù)??梢栽跇?gòu)造器里執(zhí)行這樣的驗(yàn)證。有些人未執(zhí)行構(gòu)造器而創(chuàng)建 Account 對(duì)象,他可能創(chuàng)建了一個(gè)具有一些負(fù)值的新帳戶(hù),這樣會(huì)使系統(tǒng)不一致,容易受到進(jìn)一步的干預(yù)。

建議

在使用對(duì)象之前,請(qǐng)檢查對(duì)象的初始化過(guò)程。要做到這一點(diǎn),每個(gè)類(lèi)都應(yīng)該有一個(gè)在構(gòu)造器中設(shè)置的私有布爾標(biāo)志,如清單 9 中的類(lèi)所示。在每個(gè)非 static 方法中,代碼在任何進(jìn)一步執(zhí)行之前都應(yīng)該檢查該標(biāo)志的值。如果該標(biāo)志的值為 true,那么控制應(yīng)該進(jìn)一步繼續(xù);否則,控制應(yīng)該拋出一個(gè)例外并停止執(zhí)行。那些從構(gòu)造器調(diào)用的方法將不會(huì)檢查初始化的變量,因?yàn)樵谡{(diào)用方法時(shí)沒(méi)有設(shè)置標(biāo)志。因?yàn)檫@些方法并不檢查標(biāo)志,所以應(yīng)該將它們聲明為 private 以防止用戶(hù)直接訪問(wèn)它們。

清單 9. 使用布爾標(biāo)志以檢查初始化過(guò)程

public class MyClass{

private boolean initialized = false;

//Other variables

public MyClass (){

//variable initialization

method1();

initialized = true;

}

private void method1(){ //no need to check for initialization variable

//code

}

public void method2(){

try{

if(initialized==true){

//proceed with the business logic

}

else{

throw new Exception("Illegal State Of the object");

}

}catch(Exception e){

e.printStackTrace();

}

}

}

如果對(duì)象由逆序列化進(jìn)行初始化,那么上面討論的驗(yàn)證機(jī)制將難以奏效,因?yàn)樵谠撨^(guò)程中并不調(diào)用構(gòu)造器。在這種情況下,類(lèi)應(yīng)該實(shí)現(xiàn) ObjectInputValidation 接口:

清單 10. 實(shí)現(xiàn) ObjectInputValidation

interface java.io.ObjectInputValidation {

public void validateObject() throws InvalidObjectException;

}

所有驗(yàn)證都應(yīng)該在 validateObject() 方法中執(zhí)行。對(duì)象還必須調(diào)用 ObjectInputStream.RegisterValidation() 方法以為逆序列化對(duì)象之后的驗(yàn)證進(jìn)行注冊(cè)。 RegisterValidation() 的第一個(gè)參數(shù)是實(shí)現(xiàn) validateObject() 的對(duì)象,通常是對(duì)對(duì)象自身的引用。注:任何實(shí)現(xiàn) validateObject() 的對(duì)象都可能充當(dāng)對(duì)象驗(yàn)證器,但對(duì)象通常驗(yàn)證它自己對(duì)其它對(duì)象的引用。RegisterValidation() 的第二個(gè)參數(shù)是一個(gè)確定回調(diào)順序的整數(shù)優(yōu)先級(jí),優(yōu)先級(jí)數(shù)字大的比優(yōu)先級(jí)數(shù)字小的先回調(diào)。同一優(yōu)先級(jí)內(nèi)的回調(diào)順序則不確定。

當(dāng)對(duì)象已逆序列化時(shí),ObjectInputStream 按照從高到低的優(yōu)先級(jí)順序調(diào)用每個(gè)已注冊(cè)對(duì)象上的 validateObject()。

不要通過(guò)名稱(chēng)來(lái)比較類(lèi)

有時(shí)候,您可能需要比較兩個(gè)對(duì)象的類(lèi),以確定它們是否相同;或者,您可能想看看某個(gè)對(duì)象是否是某個(gè)特定類(lèi)的實(shí)例。因?yàn)?JVM 可能包括多個(gè)具有相同名稱(chēng)的類(lèi)(具有相同名稱(chēng)但卻在不同包內(nèi)的類(lèi)),所以您不應(yīng)該根據(jù)名稱(chēng)來(lái)比較類(lèi)。

影響

如果根據(jù)名稱(chēng)來(lái)比較類(lèi),您可能無(wú)意中將您不希望授予別人的權(quán)利授予了闖入者的類(lèi),因?yàn)殛J入者可以定義與您的類(lèi)同名的類(lèi)。

例如,請(qǐng)假設(shè)您想確定某個(gè)對(duì)象是否是類(lèi) com.bar.Foo 的實(shí)例。清單 11 演示了完成這一任務(wù)的錯(cuò)誤方法:

清單 11. 比較類(lèi)的錯(cuò)誤方法

if(obj.getClass().getName().equals("Foo")) // Wrong!

// objects class is named Foo

}else{

// object's class has some other name

}

建議

在那些非得根據(jù)名稱(chēng)來(lái)比較類(lèi)的情況下,您必須格外小心,必須確保使用了當(dāng)前類(lèi)的 ClassLoader 的當(dāng)前名稱(chēng)空間,如清單 12 中所示:

清單 12. 比較類(lèi)的更好方法

if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){

// object's class is equal to

//the class that this class calls "com.bar.Foo"

}else{

// object's class is not equal to the class that

// this class calls "com.bar.Foo"

}

然而,比較類(lèi)的更好方法是直接比較類(lèi)對(duì)象看它們是否相等。例如,如果您想確定兩個(gè)對(duì)象 a 和 b 是否屬同一個(gè)類(lèi),那么您就應(yīng)該使用清單 13 中的代碼:

清單 13. 直接比較對(duì)象來(lái)看它們是否相等

if(a.getClass() == b.getClass()){

// objects have the same class

}else{

// objects have different classes

}

盡可能少用直接名稱(chēng)比較。

不要使用內(nèi)部類(lèi)

Java 字節(jié)碼沒(méi)有內(nèi)部類(lèi)的概念,因?yàn)榫幾g器將內(nèi)部類(lèi)轉(zhuǎn)換成了普通類(lèi),而如果沒(méi)有將內(nèi)部類(lèi)聲明為 private,則同一個(gè)包內(nèi)的任何代碼恰好能訪問(wèn)該普通類(lèi)。

影響

因?yàn)橛羞@一特性,所以包內(nèi)的惡意代碼可以訪問(wèn)這些內(nèi)部類(lèi)。如果內(nèi)部類(lèi)能夠訪問(wèn)括起外部類(lèi)的字段,那么情況會(huì)變得更糟??赡芤呀?jīng)將這些字段聲明為 private,這樣內(nèi)部類(lèi)就被轉(zhuǎn)換成了獨(dú)立類(lèi),但當(dāng)內(nèi)部類(lèi)訪問(wèn)外部類(lèi)的字段時(shí),編譯器就將這些字段從專(zhuān)用(private)的變?yōu)樵诎╬ackage)的作用域內(nèi)有效的。內(nèi)部類(lèi)暴露了已經(jīng)夠糟糕的了,但更糟糕的是編譯器使您將某些字段成為 private 的舉動(dòng)成為徒勞。

建議 如果能夠不使用內(nèi)部類(lèi)就不要使用內(nèi)部類(lèi)。

對(duì)付低嚴(yán)重性暴露的技巧

請(qǐng)遵循下列建議以避免低嚴(yán)重性靜態(tài)安全性暴露:

避免返回可變對(duì)象

檢查本機(jī)方法

避免返回可變對(duì)象

Java 方法返回對(duì)象引用的副本。如果實(shí)際對(duì)象是可改變的,那么使用這樣一個(gè)引用調(diào)用程序可能會(huì)改變它的內(nèi)容,通常這是我們所不希望見(jiàn)到的。

影響

請(qǐng)考慮這個(gè)示例:某個(gè)方法返回一個(gè)對(duì)敏感對(duì)象的內(nèi)部數(shù)組的引用,假定該方法的調(diào)用程序不改變這些對(duì)象。即使數(shù)組對(duì)象本身是不可改變的,也可以在數(shù)組對(duì)象以外操作數(shù)組的內(nèi)容,這種操作將反映在返回該數(shù)組的對(duì)象中。如果該方法返回可改變的對(duì)象,那么事情會(huì)變得更糟;外部實(shí)體可以改變?cè)谀莻€(gè)類(lèi)中聲明的 public 變量,這種改變將反映在實(shí)際對(duì)象中。

清單 14 演示了脆弱性。getExposedObj() 方法返回了 Exposed 對(duì)象的引用副本,該對(duì)象是可變的:

清單 14. 返回可變對(duì)象的引用副本

class Exposed{

private int id;

private String name;

public Exposed(){

}

public Exposed(int id, String name){

this.id = id;

this.name = name;

}

public int getId(){

return id;

}

public String getName(){

return name;

}

public void setId(int id){

this.id=id;

}

public void setName(String name){

this.name = name;

}

public void display(){

System.out.println("Id = "+ id + " Name = "+ name);

}

}

public class Exp12{

private Exposed exposedObj = new Exposed(1,"Harry Porter");

public Exposed getExposedObj(){

return exposedObj; //returns a reference to the object.

}

public static void main(String[] args){

Exp12 exp12 = new Exp12();

exp12.getExposedObj().display();

Exposed exposed = exp12.getExposedObj();

exposed.setId(10);

exposed.setName("Hacker");

exp12.getExposedObj().display();

}

}

建議

如果方法返回可改變的對(duì)象,但又不希望調(diào)用程序改變?cè)搶?duì)象,請(qǐng)修改該方法使之不返回實(shí)際對(duì)象而是返回它的副本或克隆。要改正清單 14 中的代碼,請(qǐng)讓它返回 Exposed 對(duì)象的副本,如清單 15 中所示:

清單 15. 返回可變對(duì)象的副本

public Exposed getExposedObj(){

return new Exposed(exposedObj.getId(),exposedObj.getName());

}

或者,您的代碼也可以返回 Exposed 對(duì)象的克隆。

檢查本機(jī)方法

本機(jī)方法是一種 Java 方法,其實(shí)現(xiàn)是用另一種編程語(yǔ)言編寫(xiě)的,如 C 或 C++。有些開(kāi)發(fā)人員實(shí)現(xiàn)本機(jī)方法,這是因?yàn)?Java 語(yǔ)言即使使用即時(shí)(just-in-time)編譯器也比許多編譯過(guò)的語(yǔ)言要慢。其它人需要使用本機(jī)代碼是為了在 JVM 以外實(shí)現(xiàn)特定于平臺(tái)的功能。

影響

使用本機(jī)代碼時(shí),請(qǐng)小心,因?yàn)閷?duì)這些代碼進(jìn)行驗(yàn)證是不可能的,而且本機(jī)代碼可能潛在地允許 applet 繞過(guò)通常的安全性管理器(Security Manager)和 Java 對(duì)設(shè)備訪問(wèn)的控制。

建議

如果非得使用本機(jī)方法,那么請(qǐng)檢查這些方法以確定:

它們返回什么

它們獲取什么作為參數(shù)

它們是否繞過(guò)安全性檢查

它們是否是 public、private 等等

它們是否含有繞過(guò)包邊界從而繞過(guò)包保護(hù)的方法調(diào)用

結(jié)束語(yǔ)

編寫(xiě)安全 Java 代碼是十分困難的,但本文描述了一些可行的實(shí)踐來(lái)幫您編寫(xiě)安全 Java 代碼。這些建議并不能解決您的所有安全性問(wèn)題,但它們將減少暴露數(shù)目。最佳軟件安全性實(shí)踐可以幫助確保軟件正常運(yùn)行。安全至關(guān)重要和高可靠系統(tǒng)設(shè)計(jì)者總是花費(fèi)大量精力來(lái)分析和跟蹤軟件行為。只有通過(guò)將安全性作為至關(guān)緊要的系統(tǒng)特性來(lái)對(duì)待 — 并且從一開(kāi)始就將它構(gòu)建到應(yīng)用程序中,我們才可以避免亡羊補(bǔ)牢似的、修修補(bǔ)補(bǔ)的安全性方法。

參考資料

請(qǐng)通過(guò)單擊文章頂部或底部的討論來(lái)參加本文的論壇。

了解關(guān)于 Java 安全性 API 的更多知識(shí)。

developerWorks 安全專(zhuān)題上通常含有有關(guān)計(jì)算機(jī)安全性的優(yōu)秀資源。

Larry Koved、 Anthony J. Nadalin、Don Neal 和 Tim Lawson 合作編寫(xiě)的 “The evolution of Java security”(developerWorks,1998 年)對(duì) Java 語(yǔ)言的安全性模型早期開(kāi)發(fā)進(jìn)行了深入探討。

Sing Li 在他的 Java 安全性系列文章(由兩部分組成的)(developerWorks, 2001 年 2 月)中向開(kāi)發(fā)人員顯示:盡管社區(qū)可能不得不重新考慮 Java 2 中的安全性設(shè)計(jì),還是出現(xiàn)了只對(duì)開(kāi)發(fā)人員有幫助,可以滿(mǎn)足他們的需求的一致的進(jìn)展:

第一部分

第二部分

John Viega、Tom Mutdosch、 Gary McGraw 和 Ed Felten 合著的 “Statically scanning Java code for security vulnerabilities” (IEEE Software,2000 年 9 月)介紹了一種 Java 工具,可以使用該工具來(lái)檢查您的 Java 代碼中的安全性漏洞。

G. McGraw 和 E. Felten 合作編寫(xiě)的 Securing Java: Getting Down to Business with Mobile Code(John Wiley 和 Sons,1998 年)深入涵蓋了 Java 安全性。(文檔是 PDF 格式的。)

定期檢查 IBM 研究 Java 安全頁(yè)面以便 IBM 在安全性領(lǐng)域的創(chuàng)新有重要發(fā)展時(shí)能夠跟蹤這一創(chuàng)新。

如果您的 Java 代碼運(yùn)行在 S/390 系統(tǒng)上,那么您將需要查閱 S/390 Java 安全頁(yè)面以獲取額外的信息。

關(guān)于作者

Bijaya Nanda Sahu 是就職于印度 IBM Global Services 的軟件工程師。他從事過(guò)各種因特網(wǎng)技術(shù)和框架(J2EE、WSBCC、JADE)、 WebSphere 相關(guān)技術(shù)、UML 和 OOAD 方面的工作。目前,他從事因特網(wǎng)銀行安全性問(wèn)題方面的工作,重點(diǎn)在 WebSphere Application Server 和 Portal Server 上。可以通過(guò) bijaya.sahu@in.ibm.com 和他聯(lián)系

java web 社區(qū)綜合信息服務(wù)平臺(tái) 規(guī)劃與設(shè)計(jì)

這是畢業(yè)設(shè)計(jì)吧,這要花的心血1000分都不夠,我勸你還是看看相關(guān)的書(shū)和信息系統(tǒng)設(shè)計(jì)的論文,多思考自己做出來(lái),這也是一份寶貴經(jīng)歷

如何用java喝mysql制作一個(gè)社區(qū)管理系統(tǒng)

社區(qū)管理人員在社區(qū)管理方面需要對(duì)基本的信息進(jìn)行管理,因此需要在系統(tǒng)中錄入與小區(qū)相關(guān)的各種信息,并且方便用戶(hù)對(duì)小區(qū)基本信息進(jìn)行查詢(xún)?;拘畔ǚ课葙Y料、車(chē)位資料以及業(yè)主信息等方面,具體如下:

1、小區(qū)管理,社區(qū)管理是智慧管理系統(tǒng)中最為重要的一項(xiàng)功能。在具體的管理實(shí)踐當(dāng)中,管理者需要對(duì)各個(gè)小區(qū)的信息進(jìn)行管理和維護(hù)。

2、車(chē)位資料管理,隨著小汽車(chē)保有量的不斷增加,小區(qū)車(chē)位日漸緊張,因此這就要求在物業(yè)管理中需要根據(jù)小區(qū)內(nèi)設(shè)置的車(chē)位信息進(jìn)行管理。所有小區(qū)車(chē)輛必須要根據(jù)設(shè)置的停車(chē)位來(lái)停放。社區(qū)管理中需要對(duì)車(chē)位資料進(jìn)行登記和管理,同時(shí)如果車(chē)位信息發(fā)生變化則需要對(duì)車(chē)位信息進(jìn)行及時(shí)的更新。

3、業(yè)主信息管理,在社區(qū)管理中需要詳細(xì)登記所有業(yè)主的信息,及時(shí)對(duì)業(yè)主的信息和住戶(hù)的信息進(jìn)行及時(shí)的更新和維護(hù)。因此在系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)中,需要提供業(yè)主信息管理的功能,這一功能直接決定了物業(yè)管理是否能夠?yàn)闃I(yè)主提供高質(zhì)量的物業(yè)管理服務(wù)。

4、人員信息管理,人員信息管理主要針對(duì)的是社區(qū)管理工作人員。物業(yè)管理工作人員是物業(yè)服務(wù)的核心主體。因此這就要求在信息系統(tǒng)中需要對(duì)社區(qū)管理人員的基本信息和基本資料進(jìn)行管理,確保小區(qū)人員信息的準(zhǔn)確性和信息變更的及時(shí)性。


分享標(biāo)題:社區(qū)人員信息java代碼 社區(qū)人員信息java代碼
文章來(lái)源:http://weahome.cn/article/dogeeed.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部