J編寫過(guò)程中安全問(wèn)題解決指南_第1頁(yè)
J編寫過(guò)程中安全問(wèn)題解決指南_第2頁(yè)
J編寫過(guò)程中安全問(wèn)題解決指南_第3頁(yè)
J編寫過(guò)程中安全問(wèn)題解決指南_第4頁(yè)
J編寫過(guò)程中安全問(wèn)題解決指南_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、(安全生產(chǎn))J編寫過(guò)程中 安全問(wèn)題解決指南20XX年XX月多年的企業(yè)咨詢豉問(wèn)經(jīng)驗(yàn).經(jīng)過(guò)實(shí)戰(zhàn)驗(yàn)證可以落地機(jī)行的卓越管理方案,值得您下載擁有在本文中,我們討論了對(duì)付13 種不同靜態(tài)暴露的技巧。對(duì)于每種暴露,我們解釋了不處理這些安全性問(wèn)題所造成的影響。我們?nèi)詾槟扑]了壹些準(zhǔn)則,要開發(fā)不受這些靜態(tài)安全性暴露威脅的、健壯且安全的 Java 應(yīng)用程序,您應(yīng)該遵循這些準(zhǔn)則。壹有合適的時(shí)機(jī),我們就提供代碼樣本(既有暴露的代碼也有無(wú)暴露的代碼) 。對(duì)付高嚴(yán)重性暴露的技巧請(qǐng)遵循下列建議以避免高嚴(yán)重性靜態(tài)安全性暴露:限制對(duì)變量的訪問(wèn)讓每個(gè)類和方法都成為 final ,除非有足夠的理由不這樣做不要依賴包作用域使類不可

2、克隆使類不可序列化使類不可逆序列化避免硬編碼敏感數(shù)據(jù)查找惡意代碼限制對(duì)變量的訪問(wèn)如果將變量聲明為 public ,那么外部代碼就能夠操作該變量。這可能會(huì)導(dǎo)致安全性暴露。影響如果實(shí)例變量為 public ,那么就能夠在類實(shí)例上直接訪問(wèn)和操作該實(shí)例變量。將實(shí)例變量聲明為 protected 且不壹定能解決這壹問(wèn)題: 雖然不可能直接在類實(shí)例基礎(chǔ)上訪問(wèn)這樣的變量,但仍然能夠從派生類訪問(wèn)這個(gè)變量。清單1 演示了帶有public 變量的代碼,因?yàn)樽兞繛閜ublic 的,所以它暴露了。清單1. 帶有public 變量的代碼classTest publicintid;protectedStringname;T

3、est()id=1;name=helloworld;/codepublicclassMyClassextendsTestpublicvoidmethodIllegalSet(Stringname)=name;/thisshouldnotbeallowedpublicstaticvoidmain(Stringargs)Testobj=newTest();obj.id=123;/thisshouldnotbeallowedMyClassmc=newMyClass();mc.methodIllegalSet(IllegalSetValue);建議壹般來(lái)說(shuō), 應(yīng)該使用取值方法而不是p

4、ublic 變量。 按照具體問(wèn)題具體對(duì)待的原則, 在確定哪些變量特別重要因而應(yīng)該聲明為 private 時(shí),請(qǐng)將編碼的方便程度及成本同安全性需要加以比較。清單2 演示了以下列方式來(lái)使之安全的代碼:清單 2. 不帶有 public 變量的代碼classTestprivateintid;privateStringname;Test()id=1;name=helloworld;publicvoidsetId(intid)this.id=id;publicvoidsetName(Stringname) =name;publicintgetId()returnid;publicStri

5、nggetName() returnname;讓每個(gè)類和方法都為 final不允許擴(kuò)展的類和方法應(yīng)該聲明為 final 。這樣做防止了系統(tǒng)外的代碼擴(kuò)展類且修改類的行為。影響僅僅將類聲明為非public 且不能防止攻擊者擴(kuò)展類,因?yàn)槿匀荒軌驈乃约旱陌鼉?nèi)訪問(wèn)該類。建議讓每個(gè)類和方法都成為 final , 除非有足夠的理由不這樣做。 按此建議, 我們要求您放棄可擴(kuò)展性,雖然它是使用諸如 Java 語(yǔ)言之類的面向?qū)ο笳Z(yǔ)言的主要優(yōu)點(diǎn)之壹。在試圖提供安全性時(shí),可擴(kuò)展性卻成了您的敵人;可擴(kuò)展性只會(huì)為攻擊者提供更多給您帶來(lái)麻煩的方法。不要依賴包作用域沒(méi)有顯式地標(biāo)注為 public 、 private 或 p

6、rotected 的類、方法和變量在它們自己的包內(nèi)是可訪問(wèn)的。影響如果 Java 包不是封閉的,那么攻擊者就能夠向包內(nèi)引入新類且使用該新類來(lái)訪問(wèn)您想保護(hù)的內(nèi)容。 諸如 java.lang 之類的壹些包缺省是封閉的, 壹些 JVM 也讓您封閉自己的包。 然而,您最好假定包是不封閉的。建議從軟件工程觀點(diǎn)來(lái)見,包作用域具有重要意義,因?yàn)樗軌蜃柚箤?duì)您想隱藏的內(nèi)容進(jìn)行偶然的、 無(wú)意中的訪問(wèn)。 但不要依靠它來(lái)獲取安全性。 應(yīng)該將類、 方法和變量顯式標(biāo)注為 public 、private 或 protected 中適合您特定需求的那種。使類不可克隆 克隆允許繞過(guò)構(gòu)造器而輕易地復(fù)制類實(shí)例。影響 即使您沒(méi)有有

7、意使類可克隆,外部源仍然 能夠定義您的類的子類,且使該子類實(shí)現(xiàn)java.lang.Cloneable 。 這就讓攻擊者創(chuàng)建了您的類的新實(shí)例。 拷貝現(xiàn)有對(duì)象的內(nèi)存映象生成了新的實(shí)例; 雖然這樣做有時(shí)候是生成新對(duì)象的可接受方法, 可是大多數(shù)時(shí)候是不可接受的。清單3 說(shuō)明了因?yàn)榭煽寺《┞兜拇a:清單3. 可克隆代碼classMyClassprivateintid;privateStringname;publicMyClass()id=1;name=HaryPorter;publicMyClass(intid,Stringname)this.id=id;=name;publicvo

8、iddisplay()System.out.println(Id=+id+Name=+name);/hackerscodetoclonetheuserclass publicclassHackerextendsMyClassimplementsCloneablepublicstaticvoidmain(Stringargs)Hackerhack=newHacker();tryMyClasso=(MyClass)hack.clone();o.display();catch(CloneNotSupportedExceptione)e.printStackTrace();建議要防止類被克隆,能夠?qū)⑶?/p>

9、單4 中所示的方法添加到您的類中:清單 4. 使您的代碼不可克隆publicfinalObjectclone()throwsjava.lang.CloneNotSupportedExceptionthrownewjava.lang.CloneNotSupportedException();如果想讓您的類可克隆且且您已經(jīng)考慮了這壹選擇的后果,那么您仍然能夠保護(hù)您的類。要做到這壹點(diǎn),請(qǐng)?jiān)谀念愔卸x壹個(gè)為 final 的克隆方法,且讓它依賴于您的壹個(gè)超類中的壹個(gè)非 final 克隆方法,如清單5 中所示:清單 5. 以安全的方式使您的代碼可克隆publicfinalObjectclone()thr

10、owsjava.lang.CloneNotSupportedExceptionsuper.clone();類中出現(xiàn) clone() 方法防止攻擊者重新定義您的 clone 方法。使類不可序列化序列化允許將類實(shí)例中的數(shù)據(jù)保存在外部文件中。闖入代碼能夠克隆或復(fù)制實(shí)例,然后對(duì)它進(jìn)行序列化。影響序列化是令人擔(dān)憂的,因?yàn)樗试S外部源獲取對(duì)您的對(duì)象的內(nèi)部狀態(tài)的控制。這壹外部源能夠?qū)⒛膶?duì)象之壹序列化成攻擊者隨后能夠讀取的字節(jié)數(shù)組,這使得攻擊者能夠完全審查您的對(duì)象的內(nèi)部狀態(tài),包括您標(biāo)記為 private 的任何字段。它也允許攻擊者訪問(wèn)您引用的任何對(duì)象的內(nèi)部狀態(tài)。建議要防止類中的對(duì)象被序列化,請(qǐng)?jiān)陬愔卸x清單

11、6 中的 writeObject() 方法:清單 6. 防止對(duì)象序列化privatefinalvoidwriteObject(ObjectOutputStreamout)throwsjava.io.NotSerializableExceptionthrownewjava.io.NotSerializableException(Thisobjectcannot beserialized);通過(guò)將 writeObject() 方法聲明為final ,防止了攻擊者覆蓋該方法。使類不可逆序列化通過(guò)使用逆序列化,攻擊者能夠用外部數(shù)據(jù)或字節(jié)流來(lái)實(shí)例化類。影響不管類是否能夠序列化,都能夠?qū)λM(jìn)行逆序列化。外

12、部源能夠創(chuàng)建逆序列化成類實(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)該在您的類中定義清單7 中的 readObject() 方法:清單7. 防止對(duì)象逆序列化privatefinalvoidreadObject(ObjectInputStreamin)throwsjava.io.NotSerializableExceptionthrownewjava.io.NotSerializableException(Thisobjectcannotbedeserialized

13、);通過(guò)將該方法聲明為 final ,防止了攻擊者覆蓋該方法。避免硬編碼敏感數(shù)據(jù)您可能會(huì)嘗試將諸如加密密鑰之類的秘密存放在您的應(yīng)用程序或庫(kù)的代碼。對(duì)于你們開發(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)行加密?但攻

14、擊者極有可能能夠推斷出加密格式,對(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è)的開發(fā)人員可能故意引入易受攻擊的代碼,打算日后利用它。這樣的代碼在初始化時(shí)可能會(huì)啟動(dòng)壹個(gè)后臺(tái)進(jìn)程,該進(jìn)程能夠?yàn)殛J入者開后門。它也能夠更改壹些敏感數(shù)據(jù)。這樣的惡意代碼有三類:類中的 main 方法定義過(guò)且未使用的方法注釋中的死代碼影響入口點(diǎn)程序可能很危險(xiǎn)而且有惡意。通常, Java 開發(fā)人員往往在其類中編寫

15、main() 方法,這有助于測(cè)試單個(gè)類的功能。 當(dāng)類從測(cè)試轉(zhuǎn)移到生產(chǎn)環(huán)境時(shí), 帶有 main() 方法的類就成為了對(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ì)這樣的代碼的注釋,那么代碼可能會(huì)影響系統(tǒng)的功能性。能夠在清單8 中見到所有三種類型的惡意代碼的示例:清單 8. 潛在惡意的 Java 代碼publicvoidunus

16、edMethod()/codewrittentoharmthesystempublicvoidusedMethod()/unusedMethod();/codeincommentputwithbadintentions,/mightaffectthesystemifuncommented/intx=100;/x=x+10;/Codeincomment,mightaffectthe/functionalityofthesystemifuncommented建議應(yīng)該將 (除啟動(dòng)應(yīng)用程序的 main() 方法之外的) main() 方法、 未使用的方法以及死代碼從應(yīng)用程序代碼中除去。在軟件交付使用之

17、前,主要開發(fā)人員應(yīng)該對(duì)敏感應(yīng)用程序進(jìn)行壹次全面的代碼評(píng)審。應(yīng)該使用“ Stub ”或“ dummy ”類代替 main() 方法以測(cè)試應(yīng)用程序的功能。對(duì)付中等嚴(yán)重性暴露的技巧請(qǐng)遵循下列建議以避免中等嚴(yán)重性靜態(tài)安全性暴露:不要依賴初始化不要通過(guò)名稱來(lái)比較類不要使用內(nèi)部類不要依賴初始化您能夠不運(yùn)行構(gòu)造器而分配對(duì)象。這些對(duì)象使用起來(lái)不安全,因?yàn)樗鼈儾皇峭ㄟ^(guò)構(gòu)造器初始化的。影響在初始化時(shí)驗(yàn)證對(duì)象確保了數(shù)據(jù)的完整性。例如,請(qǐng)想象為客戶創(chuàng)建新帳戶的 Account 對(duì)象。只有在Account 期初余額大于0 時(shí),才能夠開設(shè)新帳戶。能夠在構(gòu)造器里執(zhí)行這樣的驗(yàn)證。有些人未執(zhí)行構(gòu)造器而創(chuàng)建Account對(duì)象,他

18、可能創(chuàng)建了壹個(gè)具有壹些負(fù)值的新帳戶,這樣會(huì)使系統(tǒng)不壹致,容易受到進(jìn)壹步的干預(yù)。建議在使用對(duì)象之前,請(qǐng)檢查對(duì)象的初始化過(guò)程。要做到這壹點(diǎn),每個(gè)類都應(yīng)該有壹個(gè)在構(gòu)造器中設(shè)置的私有布爾標(biāo)志,如清單9 中的類所示。在每個(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以防止用戶直接訪問(wèn)它們。清單 9. 使用布爾標(biāo)志以檢查初始化過(guò)程publiccl

19、assMyClassprivatebooleaninitialized=false;/OthervariablespublicMyClass()/variableinitializationmethod1();initialized=true;privatevoidmethod1()/noneedtocheckforinitializationvariable/codepublicvoidmethod2()tryif(initialized=true)/proceedwiththebusinesslogicelsethrownewException(IllegalStateOftheobjec

20、t);catch(Exceptione)e.printStackTrace();如果對(duì)象由逆序列化進(jìn)行初始化,那么上面討論的驗(yàn)證機(jī)制將難以奏效,因?yàn)樵谠撨^(guò)程中且不調(diào)用構(gòu)造器。在這種情況下,類應(yīng)該實(shí)現(xiàn)ObjectInputValidation 接口:清單 10. 實(shí)現(xiàn) ObjectInputValidationinterfacejava.io.ObjectInputValidationpublicvoidvalidateObject()throwsInvalidObjectException;所 有 驗(yàn) 證 都 應(yīng) 該 在 validateObject() 方 法 中 執(zhí) 行 。 對(duì) 象 仍 必

21、 須 調(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)

22、先級(jí)順序調(diào)用每個(gè)已注冊(cè)對(duì)象上的validateObject() 。不要通過(guò)名稱來(lái)比較類有時(shí)候,您可能需要比較倆個(gè)對(duì)象的類,以確定它們是否相同;或者,您可能想見見某個(gè)對(duì)象是否是某個(gè)特定類的實(shí)例。因?yàn)?JVM 可能包括多個(gè)具有相同名稱的類(具有相同名稱但卻在不同包內(nèi)的類) ,所以您不應(yīng)該根據(jù)名稱來(lái)比較類。影響如果根據(jù)名稱來(lái)比較類,您可能無(wú)意中將您不希望授予別人的權(quán)利授予了闖入者的類,因?yàn)殛J入者能夠定義和您的類同名的類。例如,請(qǐng)假設(shè)您想確定某個(gè)對(duì)象是否是類com.bar.Foo 的實(shí)例。清單11 演示了完成這壹任務(wù)的錯(cuò)誤方法:清單 11. 比較類的錯(cuò)誤方法if(obj.getClass().getN

23、ame().equals(Foo)/Wrong!/objectsclassisnamedFooelse/objectsclasshassomeothername建議在那些非得根據(jù)名稱來(lái)比較類的情況下,您必須格外小心,必須確保使用了當(dāng)前類的ClassLoader 的當(dāng)前名稱空間,如清單12 中所示:清單 12. 比較類的更好方法if(obj.getClass()=this.getClassLoader().loadClass(com.bar.Foo)/objectsclassisequalto/theclassthatthisclasscallscom.bar.Fooelse/objectscl

24、assisnotequaltotheclassthat/thisclasscallscom.bar.Foo然而,比較類的更好方法是直接比較類對(duì)象見它們是否相等。例如,如果您想確定倆個(gè)對(duì)象a 和 b 是否屬同壹個(gè)類,那么您就應(yīng)該使用清單13 中的代碼:清單 13. 直接比較對(duì)象來(lái)見它們是否相等if(a.getClass()=b.getClass() /objectshavethesameclasselse/objectshavedifferentclasses盡可能少用直接名稱比較。不要使用內(nèi)部類Java 字節(jié)碼沒(méi)有內(nèi)部類的概念, 因?yàn)榫幾g器將內(nèi)部類轉(zhuǎn)換成了普通類, 而如果沒(méi)有將內(nèi)部類聲明為 p

25、rivate ,則同壹個(gè)包內(nèi)的任何代碼恰好能訪問(wèn)該普通類。影響因?yàn)橛羞@壹特性,所以包內(nèi)的惡意代碼能夠訪問(wèn)這些內(nèi)部類。如果內(nèi)部類能夠訪問(wèn)括起外部類的字段,那么情況會(huì)變得更糟。可能已經(jīng)將這些字段聲明為 private ,這樣內(nèi)部類就被轉(zhuǎn)換成了獨(dú)立類,但當(dāng)內(nèi)部類訪問(wèn)外部類的字段時(shí),編譯器就將這些字段從專用( private )的變?yōu)樵诎? package )的作用域內(nèi)有效的。內(nèi)部類暴露了已經(jīng)夠糟糕的了,但更糟糕的是編譯器使您將某些字段成為 private 的舉動(dòng)成為徒勞。建議如果能夠不使用內(nèi)部類就不要使用內(nèi)部類。對(duì)付低嚴(yán)重性暴露的技巧請(qǐng)遵循下列建議以避免低嚴(yán)重性靜態(tài)安全性暴露:避免返回可變對(duì)象檢查本

26、機(jī)方法避免返回可變對(duì)象Java 方法返回對(duì)象引用的副本。 如果實(shí)際對(duì)象是可改變的, 那么使用這樣壹個(gè)引用調(diào)用程序可能會(huì)改變它的內(nèi)容,通常這是我們所不希望見到的。影響請(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è)類中聲明的 public 變量,這種改變將反映在實(shí)際對(duì)象中。清單 14 演示了脆弱性。 getExposedObj() 方法返回了 Exposed 對(duì)象的引用副本,

27、該對(duì)象是可變的:清單 14. 返回可變對(duì)象的引用副本classExposedprivateintid;privateStringname;publicExposed()publicExposed(intid,Stringname)this.id=id;=name;publicintgetId()returnid; publicStringgetName()returnname;publicvoidsetId(intid)this.id=id;publicvoidsetName(Stringname)=name;publicvoiddisplay()Syste

28、m.out.println(Id=+id+Name=+name);publicclassExp12privateExposedexposedObj=newExposed(1,HarryPorter);publicExposedgetExposedObj()returnexposedObj;/returnsareferencetotheobject.publicstaticvoidmain(Stringargs)Exp12exp12=newExp12();exp12.getExposedObj().display();Exposedexposed=exp12.getExposedObj();ex

29、posed.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ì)象的副本publicExposedgetExposedObj()returnnewExposed(exposedObj.getId(),exposedObj.getName();或者,您的代碼也能夠返回 Exposed 對(duì)象的克

30、隆。檢查本機(jī)方法本機(jī)方法是壹種 Java 方法,其實(shí)現(xiàn)是用另壹種編程語(yǔ)言編寫的,如 C 或 C+ 。有些開發(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ò)通常的安全性管理器( SecurityManager )和 Java 對(duì)設(shè)備訪問(wèn)的控制。建議 如果非得使用本機(jī)方法,那么請(qǐng)檢查這些方法以確定:它們返回什么 它們獲取什么作為參數(shù)它們是否繞過(guò)安全性檢查它們是否是public 、 private 等等它們是否含有繞過(guò)包邊界從而繞過(guò)包保護(hù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論