版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄4.1Java開(kāi)發(fā)安全現(xiàn)狀4.2Java常見(jiàn)安全漏洞4.3Java安全編碼規(guī)范1本章學(xué)習(xí)目標(biāo)1.了解Java開(kāi)發(fā)的安全現(xiàn)狀;2.理解Java安全漏洞的原理;3.理解Java漏洞的防御方法;4.掌握J(rèn)ava安全編碼規(guī)范;2Java開(kāi)發(fā)安全現(xiàn)狀4.1Java安全現(xiàn)狀Java因其面向?qū)ο?、跨平臺(tái)、安全性、多線程等特點(diǎn)成為許多應(yīng)用系統(tǒng)的理想開(kāi)發(fā)語(yǔ)言,常被用來(lái)進(jìn)行面向?qū)ο蟮膽?yīng)用開(kāi)發(fā),可視化、可操作化的軟件開(kāi)發(fā),數(shù)據(jù)庫(kù)的操作和連接設(shè)計(jì)等工作。Java的廣泛應(yīng)用使得攻擊者開(kāi)始更多的發(fā)動(dòng)針對(duì)Java安全漏洞的攻擊,造成大量使用Java的用戶受害,增大了攻擊的危害程度和范圍。Java產(chǎn)生的安全問(wèn)題(1)Java第三方庫(kù)不安全。程序員在開(kāi)發(fā)時(shí)常從Java豐富的第三方庫(kù)中導(dǎo)入大量代碼,如果引用的代碼中存在安全漏洞且開(kāi)發(fā)人員沒(méi)有進(jìn)行安全檢查,攻擊者就可以利用所導(dǎo)入代碼中的缺陷進(jìn)行服務(wù)器攻擊或敏感數(shù)據(jù)訪問(wèn)。(2)Java版本更新不及時(shí)。Java版本由于其應(yīng)用數(shù)量巨大而發(fā)布更新的時(shí)間不夠及時(shí)和全面,且補(bǔ)丁有時(shí)會(huì)破壞應(yīng)用軟件的功能,無(wú)法及時(shí)修復(fù)漏洞以抵抗攻擊者。Java安全防護(hù)不夠有效Java應(yīng)用的安全防護(hù)通?;诰W(wǎng)絡(luò)或測(cè)試,但隨著技術(shù)發(fā)展,這兩種方法都開(kāi)始變得不夠可靠:(1)基于網(wǎng)絡(luò)的防御系統(tǒng)需要進(jìn)行微調(diào)以避免阻塞合法的流量,因此程序員需要投入大量精力來(lái)調(diào)整,使之只允許合法流量通行。(2)應(yīng)用測(cè)試工具可以分析軟件是否存在漏洞,但其分析結(jié)果數(shù)量通常十分龐大,問(wèn)題主次不清晰。Java常見(jiàn)安全漏洞4.2SQL注入的原理和危害SQL是結(jié)構(gòu)化查詢(xún)語(yǔ)言的簡(jiǎn)稱(chēng),大量應(yīng)用程序使用SQL數(shù)據(jù)庫(kù)存放數(shù)據(jù)。SQL注入攻擊是指攻擊者將惡意的SQL命令插入到輸入數(shù)據(jù)中遞交給服務(wù)器,當(dāng)應(yīng)用程序沒(méi)有檢查用戶輸入,并將用戶輸入作為原始SQL查詢(xún)語(yǔ)句的一部分時(shí),惡意輸入將會(huì)改變程序原始的SQL查詢(xún)邏輯并執(zhí)行攻擊者構(gòu)造的任意命令。攻擊者通過(guò)SQL注入可以獲得網(wǎng)站數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限,從而獲取網(wǎng)站數(shù)據(jù)庫(kù)中的所有數(shù)據(jù),篡改數(shù)據(jù)庫(kù)中的數(shù)據(jù)?;仫@注入和盲注基于錯(cuò)誤回顯的SQL注入是指攻擊者通過(guò)利用查詢(xún)語(yǔ)句獲得回顯到頁(yè)面的報(bào)錯(cuò)信息,從而判斷數(shù)據(jù)庫(kù)中的字段數(shù)、顯示位,查看表名、列名等信息。盲注是指攻擊者在無(wú)法獲得數(shù)據(jù)庫(kù)返回值的情況下,通過(guò)一些方法對(duì)查詢(xún)語(yǔ)法進(jìn)行猜測(cè)嘗試,實(shí)施SQL注入。盲注的方法一般可分為兩類(lèi):(1)布爾盲注:在SQL注入過(guò)程中,Web頁(yè)面僅返回True(頁(yè)面)和False(頁(yè)面),通過(guò)構(gòu)造邏輯判斷來(lái)獲取想要的信息。(2)時(shí)間盲注:加入特定的時(shí)間函數(shù),通過(guò)查看web頁(yè)面返回的時(shí)間差來(lái)判斷注入的語(yǔ)句是否正確。9二階SQL注入二階SOL注入要求攻擊者對(duì)不同功能之間的關(guān)系有著一定的理解,相對(duì)一階注入其更不易被檢測(cè)出。二階SOL注入的攻擊流程如下:(1)攻擊者提交包含惡意SQL語(yǔ)句的HTTP數(shù)據(jù)報(bào)文請(qǐng)求到服務(wù)端。(2)服務(wù)端將提交的數(shù)據(jù)信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。(3)攻擊者向服務(wù)端發(fā)送第二個(gè)與第一次不相同的請(qǐng)求數(shù)據(jù)信息。(4)服務(wù)端查詢(xún)數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)信息以處理第二個(gè)請(qǐng)求信息,則第一次請(qǐng)求中惡意構(gòu)造的SQL語(yǔ)句將在服務(wù)端環(huán)境中執(zhí)行。(5)攻擊者通過(guò)服務(wù)器的返回結(jié)果判斷二次注入漏洞利用是否成功。SQL注入的防御措施(1)參數(shù)化執(zhí)行語(yǔ)句:編程人員通過(guò)使用參數(shù)化語(yǔ)句而非直接使用用戶的輸入來(lái)創(chuàng)建SQL查詢(xún)語(yǔ)句。在Java中,參數(shù)化執(zhí)行指通過(guò)使用預(yù)編譯語(yǔ)句PreparedStatement代替直接的語(yǔ)句執(zhí)行Statement。(2)輸入驗(yàn)證:驗(yàn)證用戶的輸入是否符合系統(tǒng)定義的標(biāo)準(zhǔn)。在Java中,主要對(duì)輸入?yún)?shù)的長(zhǎng)度、范圍和類(lèi)型進(jìn)行校驗(yàn)。(3)進(jìn)行縱深防御:縱深防御實(shí)施三個(gè)層次的防御保護(hù)數(shù)據(jù)庫(kù):應(yīng)用程序在訪問(wèn)數(shù)據(jù)庫(kù)時(shí)使用盡可能低級(jí)別的特權(quán);數(shù)據(jù)庫(kù)中去掉所有的無(wú)用的缺省功能;數(shù)據(jù)庫(kù)補(bǔ)丁的更新要進(jìn)行評(píng)估且及時(shí)更新。(4)輸出編碼:對(duì)程序各個(gè)模塊之間或者各個(gè)部分之間傳遞的數(shù)據(jù)進(jìn)行編碼。XSS跨站腳本原理和危害跨站腳本攻擊(XSS)是一種針對(duì)客戶端瀏覽器的注入攻擊,攻擊者將惡意腳本注入到Web應(yīng)用程序中,當(dāng)其他用戶訪問(wèn)被注入惡意腳本的Web應(yīng)用程序時(shí),惡意腳本就會(huì)被下載到該用戶的瀏覽器中并運(yùn)行,注入的惡意腳本能夠在支持HTML、JavaScript、Flash、ActiveX、VBScript等語(yǔ)言的客戶端瀏覽器上執(zhí)行,造成主機(jī)上的敏感信息泄露、Cookie被竊取、配置被更改、重定向到其它網(wǎng)站等后果。XSS漏洞產(chǎn)生與分類(lèi)XSS漏洞的產(chǎn)生原因主要有兩個(gè):(1)HTML協(xié)議無(wú)法區(qū)分?jǐn)?shù)據(jù)和代碼,即無(wú)法辨別出用戶輸入的非法數(shù)據(jù),因此攻擊者可以將惡意代碼注入HTML代碼中。(2)Web應(yīng)用程序在將用戶數(shù)據(jù)發(fā)送回瀏覽器時(shí)沒(méi)有做適當(dāng)?shù)霓D(zhuǎn)義處理,使得包含惡意腳本的數(shù)據(jù)被注入到Web網(wǎng)頁(yè)中。根據(jù)XSS漏洞注入位置和觸發(fā)流程的不同,XSS漏洞主要分為三類(lèi):反射型XSS漏洞、存儲(chǔ)型XSS漏洞和基于DOM型XSS漏洞。反射型XSS漏洞反射型XSS的攻擊過(guò)程如下:(1)用戶登錄網(wǎng)站A得到會(huì)話Cookie。(2)攻擊者誘使用戶點(diǎn)擊含有攻擊腳本的惡意URL來(lái)訪問(wèn)含有XSS漏洞的網(wǎng)站A。(3)用戶點(diǎn)擊攻擊者提供的URL登錄到網(wǎng)站A。(4)網(wǎng)站A將惡意腳本插入到網(wǎng)頁(yè)中返回給用戶。(5)惡意代碼將用戶的會(huì)話Cookie發(fā)送給攻擊者控制的網(wǎng)站B。(6)攻擊者從網(wǎng)站B上得到用戶的會(huì)話Cookie。(7)攻擊者劫持用戶會(huì)話,實(shí)施攻擊。反射型XSS漏洞攻擊過(guò)程存儲(chǔ)型XSS漏洞(1)攻擊者將構(gòu)造的惡意腳本插入到網(wǎng)頁(yè)中。(2)服務(wù)器端將惡意腳本存儲(chǔ)在數(shù)據(jù)庫(kù)中。(3)用戶請(qǐng)求訪問(wèn)網(wǎng)站A的數(shù)據(jù)。(4)網(wǎng)站A從數(shù)據(jù)庫(kù)獲取包含惡意腳本的數(shù)據(jù)。(5)網(wǎng)站A將包含惡意代碼的數(shù)據(jù)傳給了用戶。(6)客戶端執(zhí)行惡意代碼,將用戶會(huì)話Cookie等信息發(fā)給攻擊者控制的網(wǎng)站B。(7)攻擊者從網(wǎng)站B獲取信息。(8)攻擊者劫持用戶會(huì)話,發(fā)動(dòng)攻擊。存儲(chǔ)型XSS漏洞攻擊過(guò)程DOM型XSS漏洞(1)用戶登錄Web應(yīng)用。(2)攻擊者發(fā)給用戶一個(gè)URL。(3)用戶點(diǎn)擊攻擊者發(fā)來(lái)的URL。(4)服務(wù)器返回包含JavaScript腳本的頁(yè)面。(5)用戶瀏覽器把頁(yè)面的HTML文本通過(guò)DOM解析瀏覽頁(yè)面內(nèi)容。(6)惡意腳本在DOM解析時(shí)啟動(dòng),傳送用戶敏感信息給攻擊者。(7)攻擊者對(duì)Web應(yīng)用發(fā)動(dòng)攻擊。DOM型XSS漏洞攻擊過(guò)程XSS漏洞的防范方法(1)HttpOnly:使瀏覽器禁止頁(yè)面的JavaScript訪問(wèn)帶有HttpOnly屬性的Cookie。(2)輸入驗(yàn)證:采用白名單驗(yàn)證和黑名單驗(yàn)證兩種方式。根據(jù)白名單對(duì)URL、查詢(xún)關(guān)鍵字、HTTP頭、POST數(shù)據(jù)的長(zhǎng)度、格式等進(jìn)行檢查;根據(jù)黑名單對(duì)包含XSS特征的內(nèi)容進(jìn)行過(guò)濾,如“<”,“script”等。(3)輸出編碼:對(duì)所有輸出字符進(jìn)行HTML編碼,將危險(xiǎn)字符轉(zhuǎn)換成無(wú)害的HTML表示,將用戶輸入的HTML腳本當(dāng)成普通文字來(lái)處理。(4)規(guī)范化:將輸入變?yōu)橐?guī)范格式或者簡(jiǎn)單格式;去掉對(duì)遠(yuǎn)程內(nèi)容的引用;使用Cookie時(shí)設(shè)置HTTPOnly屬性等。重定向重定向是指服務(wù)端發(fā)送狀態(tài)碼給客戶端,通知客戶端瀏覽器重新訪問(wèn)新的地址,Java開(kāi)發(fā)人員通常通過(guò)HttpServletResponse對(duì)象的sendRedirect()實(shí)現(xiàn)重定向。重定向攻擊是指瀏覽器在接到服務(wù)器發(fā)送的重定向請(qǐng)求時(shí)沒(méi)有驗(yàn)證傳入的新地址的可靠性,攻擊者通過(guò)修改請(qǐng)求數(shù)據(jù)將用戶重定向到構(gòu)造好的惡意網(wǎng)站,對(duì)用戶進(jìn)行釣魚(yú)詐騙。重定向攻擊的危害很大:(1)對(duì)用戶來(lái)說(shuō),攻擊者可利用重定向漏洞收集用戶的個(gè)人信息,使用戶造成經(jīng)濟(jì)損失。(2)對(duì)包含在線業(yè)務(wù)的企業(yè)來(lái)說(shuō),其網(wǎng)站遭受重定向攻擊會(huì)妨礙業(yè)務(wù)正常運(yùn)營(yíng),影響企業(yè)名譽(yù)。重定向攻擊的防范方法(1)referer限制開(kāi)發(fā)者在能確定傳入的鏈接來(lái)源時(shí),可通過(guò)referer限制檢查訪問(wèn)請(qǐng)求是否來(lái)自合法的服務(wù)器,以保證鏈接的安全性。(2)加入有效性驗(yàn)證Token在生成的鏈接內(nèi)加入用戶不可控的Token進(jìn)行校驗(yàn),可以避免攻擊者惡意利用用戶自己生成的鏈接。路徑遍歷路徑遍歷漏洞是指服務(wù)器在外界以參數(shù)形式訪問(wèn)數(shù)據(jù)時(shí)沒(méi)有對(duì)文件名進(jìn)行充分檢驗(yàn),攻擊者可通過(guò)輸入惡意構(gòu)造的參數(shù)../字符遍歷目錄,訪問(wèn)受限的數(shù)據(jù)。攻擊者利用路徑遍歷漏洞可以獲取系統(tǒng)文件及服務(wù)器的配置文件等敏感數(shù)據(jù),甚至在Web服務(wù)器的根目錄以外執(zhí)行造成系統(tǒng)崩潰的指令。路徑遍歷的防范方法(1)使用chroot設(shè)置根目錄。經(jīng)由chroot設(shè)置根目錄的程序,將無(wú)法對(duì)指定根目錄之外的文件進(jìn)行訪問(wèn)、讀取或更改文件內(nèi)容。(2)控制輸入數(shù)據(jù)。對(duì)網(wǎng)站用戶提交的文件名進(jìn)行統(tǒng)一編碼,對(duì)文件類(lèi)型進(jìn)行白名單控制,對(duì)包含惡意符號(hào)或者空字節(jié)的文件進(jìn)行過(guò)濾。(3)設(shè)置系統(tǒng)對(duì)站點(diǎn)的用戶授權(quán)。進(jìn)行站點(diǎn)安全設(shè)置防止攻擊者仿冒為合法用戶執(zhí)行操作,進(jìn)行分級(jí)授權(quán)避免用戶越級(jí)和訪問(wèn)不合法區(qū)域。(4)規(guī)范文件名的使用。避免由外部指定文件名,文件名不能包含目錄名,文件名不能包含/、\、:等字符,固定文件名。不安全的哈希算法安全哈希算法是一種安全雜湊算法,數(shù)字消息通過(guò)哈希算法能計(jì)算出對(duì)應(yīng)的長(zhǎng)度固定的字符串(消息摘要),用戶可以通過(guò)比對(duì)消息發(fā)送時(shí)和收到時(shí)的消息摘要來(lái)驗(yàn)證數(shù)據(jù)的完整性。安全哈希算法常用于在數(shù)據(jù)庫(kù)中加密保存用戶密碼和數(shù)字簽名中。安全哈希算法的安全性基于以下特性:(1)不可以從消息摘要中復(fù)原信息。(2)兩個(gè)不同的消息不會(huì)產(chǎn)生同樣的消息摘要。密碼專(zhuān)家在2005年發(fā)布了對(duì)安全哈希算法的攻擊,只需少于2的69次方的計(jì)算復(fù)雜度,就能找到一組碰撞,和安全哈希算法的兩個(gè)特性相悖,因此安全哈希算法已不再安全。XPath注入XPath是XML路徑語(yǔ)言,可從XML文檔讀取各種信息。XPath注入攻擊是指攻擊者利用XPath解析器的松散輸入和容錯(cuò)特性,在URL、表單等輸入?yún)?shù)上附帶惡意的XPath查詢(xún)語(yǔ)句,當(dāng)這些輸入作為參數(shù)傳入Web應(yīng)用程序,惡意XPath查詢(xún)語(yǔ)句將被執(zhí)行。XPath注入攻擊具有:(1)廣泛性。所有利用XPath語(yǔ)法的Web應(yīng)用程序,如果未對(duì)輸入的XPath查詢(xún)做嚴(yán)格處理都會(huì)存在XPath注入漏洞。(2)危害性大。XPath注入可以得到完整的XML文檔,即完整的數(shù)據(jù)庫(kù)。XPath注入的防御技術(shù)(1)在服務(wù)端處理數(shù)據(jù)前,驗(yàn)證提交數(shù)據(jù)的合法性。(2)檢查提交的數(shù)據(jù)是否包含特殊字符,對(duì)特殊字符進(jìn)行編碼轉(zhuǎn)換或替換,刪除敏感字符或字符串。(3)用IE錯(cuò)誤編碼信息替換系統(tǒng)出現(xiàn)的錯(cuò)誤信息。(4)參數(shù)化XPath查詢(xún),將需要構(gòu)建的XPath查詢(xún)表達(dá)式以變量形式表示。(5)用MD5、SSL等加密算法在數(shù)據(jù)敏感信息和數(shù)據(jù)傳輸過(guò)程中加密。硬編碼密碼硬編碼密碼是指在系統(tǒng)中采用明文的形式存儲(chǔ)密碼,使用硬編碼密碼可以一定程度的提高軟件開(kāi)發(fā)效率。硬編碼密碼會(huì)造成任何有該代碼權(quán)限的人都能讀取此密碼,濫用密碼的現(xiàn)象出現(xiàn)的可能將大大增大。程序員在編寫(xiě)程序時(shí)應(yīng)盡量避免對(duì)密碼進(jìn)行硬編碼,而采用對(duì)密碼加以模糊化或先經(jīng)過(guò)hash處理再存儲(chǔ),或在外部資源文件中進(jìn)行處理的方法。Java安全編碼規(guī)范4.3聲明和初始化(DCL)(1)防止類(lèi)的初始化循環(huán)(2)不要重用Java標(biāo)準(zhǔn)庫(kù)的已經(jīng)公開(kāi)的標(biāo)識(shí)(3)在for-each語(yǔ)句中不要修改集合的元素防止類(lèi)的初始化循環(huán)規(guī)范描述:對(duì)類(lèi)進(jìn)行初始化包括執(zhí)行該類(lèi)的static靜態(tài)初始化方法和初始化該類(lèi)中的靜態(tài)成員(類(lèi)變量),在進(jìn)行類(lèi)的初始化時(shí),避免類(lèi)的初始化循環(huán)。(1)類(lèi)內(nèi)循環(huán)不符合規(guī)則的代碼示例如下,它存在一個(gè)涉及多個(gè)類(lèi)的類(lèi)初始化循環(huán)。防止類(lèi)的初始化循環(huán)符合規(guī)則的代碼示例如下防止類(lèi)的初始化循環(huán)(2)類(lèi)間循環(huán)不符合規(guī)則的代碼示例如下,在程序中聲明了兩個(gè)類(lèi),這兩個(gè)類(lèi)都有靜態(tài)變量,且這些靜態(tài)變量的值是互相依賴(lài)的。符合規(guī)則的代碼示例不要重用Java標(biāo)準(zhǔn)庫(kù)的已經(jīng)公開(kāi)的標(biāo)識(shí)規(guī)范描述:不要重用在Java標(biāo)準(zhǔn)庫(kù)中已經(jīng)使用過(guò)的公共標(biāo)識(shí)、工具類(lèi)、接口或者包。風(fēng)險(xiǎn):重用公有的標(biāo)識(shí)會(huì)降低代碼的可讀性和可維護(hù)性不符合規(guī)則的代碼示例如下,這個(gè)不符合規(guī)則的代碼實(shí)現(xiàn)了一個(gè)類(lèi),這個(gè)類(lèi)重用了java.util.Vector的名稱(chēng)。調(diào)用者以為調(diào)用的是java.util.Vector將所有增強(qiáng)for語(yǔ)句的循環(huán)變量聲明為final類(lèi)型規(guī)范描述:在基本的for語(yǔ)句中,給循環(huán)變量賦值不會(huì)影響循環(huán)的迭代次序,但在增強(qiáng)的for語(yǔ)句中,給循環(huán)變量賦值等價(jià)于修改循環(huán)體的局部變量的值,這種修改不一定是錯(cuò)誤的,但會(huì)模糊循環(huán)的行為或者意味著程序員對(duì)for-each語(yǔ)句的內(nèi)在實(shí)現(xiàn)存在理解上的問(wèn)題。不符合規(guī)則的代碼示例如下,代碼示例想要使用增強(qiáng)型的for循環(huán)處理對(duì)象集合。此外,它還希望跳過(guò)對(duì)集合中某一個(gè)元素的處理。將所有增強(qiáng)for語(yǔ)句的循環(huán)變量聲明為final類(lèi)型符合規(guī)則的代碼示例如下風(fēng)險(xiǎn):給for-each的循環(huán)變量賦值,不影響整體的迭代次序,這樣會(huì)導(dǎo)致程序員產(chǎn)生困惑,并且會(huì)讓數(shù)據(jù)的狀態(tài)不一致。表達(dá)式(EXP)(1)不要忽略方法的返回值(2)不要解引用空指針(3)不要使用Object.equals()比較兩個(gè)數(shù)組的內(nèi)容(4)不要用相等操作符比較基礎(chǔ)類(lèi)型的封裝值(5)不要將不同類(lèi)型的參數(shù)傳給特定Java集合方法(6)不要在斷言中使用有副作用的表達(dá)式不要忽略方法的返回值規(guī)范描述:如果通過(guò)返回值來(lái)判斷方法調(diào)用成功與否,或者通過(guò)返回值來(lái)更新對(duì)象或數(shù)據(jù)成員,當(dāng)忽略方法的返回值時(shí),可能會(huì)產(chǎn)生安全風(fēng)險(xiǎn)。不符合規(guī)則的代碼示例如下:
符合規(guī)則的代碼示例如下:風(fēng)險(xiǎn):忽略方法返回值會(huì)導(dǎo)致不可預(yù)期的程序行為。不要解引用空指針規(guī)范描述:在需要對(duì)象的實(shí)例中,不要使用null值,包括調(diào)用null對(duì)象的實(shí)例方法、訪問(wèn)或修改null對(duì)象的字段、取數(shù)組為null的長(zhǎng)度、訪問(wèn)或修改數(shù)組元素為null的對(duì)象、拋出的異常對(duì)象為null等情況。不符合規(guī)則的代碼示例如下不要使用Object.equals()比較兩個(gè)數(shù)組的內(nèi)容規(guī)范描述:使用object.equals()來(lái)比較兩個(gè)數(shù)組的值常被誤解為內(nèi)容相等,而equals方法比較的是數(shù)組的引用而不是數(shù)組內(nèi)容。要比較兩個(gè)數(shù)組的內(nèi)容需要使用兩個(gè)參數(shù)的Arrays.equals()。風(fēng)險(xiǎn):則當(dāng)使用equals()方法來(lái)比較數(shù)組內(nèi)容時(shí),會(huì)產(chǎn)生不正確的結(jié)果,從而導(dǎo)致安全問(wèn)題。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下不要用相等操作符比較基礎(chǔ)類(lèi)型的封裝值規(guī)范描述:不要用==和!=對(duì)基礎(chǔ)數(shù)據(jù)類(lèi)型的封裝值進(jìn)行比較,因?yàn)檫@些操作符比較的是對(duì)象引用而不是對(duì)象值。如果自動(dòng)封裝的值是true、false,在\u0000到\u007f范圍的char,在-128到127的int或short,那么用==和!=進(jìn)行比較結(jié)果是成立的。風(fēng)險(xiǎn):使用等號(hào)操作符比較封裝的基礎(chǔ)類(lèi)型數(shù)據(jù)會(huì)導(dǎo)致錯(cuò)誤的比較結(jié)果。不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下不要將不同類(lèi)型的參數(shù)傳給特定Java集合方法規(guī)范描述:Java集合框架接口有采用泛型定義的,有沒(méi)有采用泛型定義的,這種設(shè)計(jì)是為了更好的兼容,但是這種設(shè)計(jì)也會(huì)導(dǎo)致編碼錯(cuò)誤。風(fēng)險(xiǎn):將參數(shù)傳遞給特定的Java集合框架方法,參數(shù)類(lèi)型與方法類(lèi)型不一致可能會(huì)導(dǎo)致無(wú)聲的失敗,從而導(dǎo)致意外的對(duì)象保留、內(nèi)存泄漏或不正確的程序操作等。
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下不要在斷言中使用有副作用的表達(dá)式規(guī)范描述:使用斷言是一種方便的機(jī)制,可以用來(lái)在代碼中加入診斷測(cè)試,使用標(biāo)準(zhǔn)斷言語(yǔ)句的表達(dá)式必須避免副作用。風(fēng)險(xiǎn):斷言中的副作用會(huì)導(dǎo)致程序行為依賴(lài)于斷言功能是否已開(kāi)啟。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下面向?qū)ο螅∣BJ)(1)限制字段的訪問(wèn)(2)防止堆污染(3)不要使用公共靜態(tài)非final字段限制字段的訪問(wèn)規(guī)范描述:將數(shù)據(jù)成員聲明為私有,則會(huì)破壞程序封裝性,同時(shí)將該數(shù)據(jù)成員暴露給其他程序。
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下不要解引用空指針規(guī)范描述:當(dāng)參數(shù)化類(lèi)型的變量引用不屬于參數(shù)化類(lèi)型的對(duì)象時(shí),就會(huì)發(fā)生堆污染。將泛型代碼與原始類(lèi)型的代碼混合在一起是堆污染的一個(gè)常見(jiàn)來(lái)源。泛型類(lèi)型在Java5引入的,對(duì)于遺留代碼的改進(jìn)會(huì)涉及到這個(gè)問(wèn)題。不符合規(guī)則的代碼示例如下,其將錯(cuò)誤的數(shù)據(jù)加入到列表。不要使用公共靜態(tài)非final字段規(guī)范描述:程序中定義了非final的publicstatic字段,該字段可被外部類(lèi)進(jìn)行更改。
不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下方法(MET)(1)必要的方法參數(shù)驗(yàn)證(2)不要使用棄用的或過(guò)時(shí)的類(lèi)和方法(3)不要在clone中調(diào)用可覆寫(xiě)的方法必要的方法參數(shù)驗(yàn)證規(guī)范描述:對(duì)方法的參數(shù)進(jìn)行驗(yàn)證,從而確保參數(shù)是在方法預(yù)計(jì)的范圍內(nèi),保證基于方法參數(shù)的操作能產(chǎn)生有效的結(jié)果。沒(méi)有對(duì)參數(shù)進(jìn)行驗(yàn)證會(huì)導(dǎo)致不一致的運(yùn)算、執(zhí)行異常和控制流漏洞。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下不要使用棄用的或過(guò)時(shí)的類(lèi)和方法規(guī)范描述:不要在新代碼中使用棄用的或過(guò)時(shí)的類(lèi)和方法。在程序中使用棄用的或過(guò)時(shí)的類(lèi)或方法會(huì)導(dǎo)致不正確的行為。不要在clone中調(diào)用可覆寫(xiě)的方法規(guī)范描述:在clone()方法中調(diào)用可重寫(xiě)的方法是不安全的,一個(gè)惡意的子類(lèi)可以對(duì)方法進(jìn)行重寫(xiě)并改變clone()的行為,一個(gè)可信任的子類(lèi)可以查看被克隆對(duì)象在創(chuàng)建完成之前的某一特定初始化的狀態(tài)。風(fēng)險(xiǎn):在克隆過(guò)程中調(diào)用可重寫(xiě)的方法會(huì)將類(lèi)的內(nèi)部暴露給惡意代碼,或是將特定的初始化狀態(tài)暴露給可信任代碼,從而違反類(lèi)的不變性。異常處理(ERR)(1)不要消除或忽略可檢查異常(2)不能允許異常泄露敏感信息(3)記錄日志時(shí)應(yīng)避免異常(4)不要在finally程序段非正常退出(5)不要捕獲NullPointerException不要消除或忽略可檢查異常規(guī)范描述:程序員常常使用一個(gè)空的或簡(jiǎn)單的catch程序段來(lái)捕獲受控制的異常,并將其消除。每一個(gè)catch程序段都必須確保程序只在功能不變有效情況下繼續(xù)運(yùn)行。因此,catch程序段必須要么從異常中恢復(fù),將異常重新拋出,由下一個(gè)和try語(yǔ)句對(duì)應(yīng)的catch段來(lái)處理異常,要么根據(jù)catch程序段的上下文拋出另一個(gè)適合的異常。風(fēng)險(xiǎn):忽略或消除異常會(huì)導(dǎo)致不一致的程序狀態(tài)。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下不能允許異常泄露敏感信息規(guī)范描述:在異常傳遞的過(guò)程中,如果不對(duì)敏感信息進(jìn)行過(guò)濾,常會(huì)導(dǎo)致信息泄露,這將有助于攻擊者實(shí)現(xiàn)對(duì)系統(tǒng)的攻擊。常見(jiàn)異常問(wèn)題如下列表。風(fēng)險(xiǎn):異??赡軙?huì)泄露敏感信息。異常名稱(chēng)信息泄露或者威脅描述java.io.FileNotFoundExceptionUnderlyingfilesystemstructure,usernameenumerationjava.sql.SQLExceptionDatabasestructure,usernameenumerationjava.util.jar.JarExceptionUnderlyingfilesystemstructurejava.util.MissingResourceExceptionResourceenumerationjava.lang.OutOfMemoryErrorDoSjava.lang.StackOverflowErrorDoS…………記錄日志時(shí)應(yīng)避免異常規(guī)范描述:記錄日志時(shí),所拋出的異常會(huì)妨礙記錄的完成,如果沒(méi)有考慮到寫(xiě)入日志時(shí)發(fā)生異常的可能性,則會(huì)造成安全漏洞。風(fēng)險(xiǎn):在對(duì)數(shù)據(jù)做日志時(shí),拋出的異常會(huì)導(dǎo)致數(shù)據(jù)丟失
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下不要在finally程序段非正常退出規(guī)范描述:不要在finally程序段中使用return、break、continue或throw語(yǔ)句,當(dāng)程序進(jìn)入帶有finally程序段的try程序段時(shí),不管try程序段是否完成執(zhí)行,finally程序段總是會(huì)執(zhí)行的,造成finally程序段非正常終止的語(yǔ)句會(huì)導(dǎo)致try程序段非正常終止,從而消除了從try或catch程序段拋出的任何異常。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下不要捕獲NullPointerException規(guī)范描述:程序不能捕獲java.lang.NullPointerException,一個(gè)運(yùn)行間拋出的空指針異常表明存在一個(gè)對(duì)空引用的解引用,這是必須在應(yīng)用程序中解決的。風(fēng)險(xiǎn):捕獲空指針異常可能掩蓋潛在的空引用,降低應(yīng)用性能,并造成難以理解和維護(hù)的代碼。
不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下線程鎖(LCK)(1)使用privatefinal鎖對(duì)象同步那些與非受信代碼交互的類(lèi)(2)不要基于可能被重用的對(duì)象進(jìn)行同步(3)不要基于通過(guò)getClass()返回的類(lèi)對(duì)象來(lái)實(shí)現(xiàn)同步(4)不要基于high-level并發(fā)對(duì)象的內(nèi)置鎖來(lái)實(shí)現(xiàn)同步使用privatefinal鎖同步與非受信代碼交互的類(lèi)規(guī)范描述:聲明為synchronized的方法和同步于this引用的代碼塊都使用了對(duì)象的monitor(內(nèi)置鎖),攻擊者會(huì)操作系統(tǒng)來(lái)觸發(fā)競(jìng)爭(zhēng)和死鎖,這可以通過(guò)獲得并且永久地持有一個(gè)可訪問(wèn)的類(lèi)的內(nèi)置鎖來(lái)實(shí)現(xiàn),從而導(dǎo)致出現(xiàn)DOS。
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下不要基于可能被重用的對(duì)象進(jìn)行同步規(guī)范描述:不要基于可能被重用的對(duì)象進(jìn)行同步風(fēng)險(xiǎn):忽略或消除異常會(huì)導(dǎo)致不一致的程序狀態(tài)。風(fēng)險(xiǎn):在使用錯(cuò)誤的對(duì)象類(lèi)型進(jìn)行鎖定,是產(chǎn)生并發(fā)漏洞的主要原因。不符合規(guī)則的代碼示例如下符合規(guī)則的代碼示例如下不要基于通過(guò)getClass()返回的類(lèi)對(duì)象實(shí)現(xiàn)同步規(guī)范描述:基于Object.getClass()的返回值進(jìn)行同步,會(huì)導(dǎo)致不預(yù)期的行為,對(duì)于子類(lèi)的Class對(duì)象來(lái)說(shuō),它與其基類(lèi)的Class對(duì)象完全不同。風(fēng)險(xiǎn):基于由getClass()返回的類(lèi)對(duì)象的同步會(huì)導(dǎo)致不確定的行為。不符合規(guī)則的代碼示例如下getClass()LockObjectgetClass()LockObject,InnerClass不要基于high-level并發(fā)對(duì)象的內(nèi)置鎖實(shí)現(xiàn)同步規(guī)范描述:在java.util.concurrent.locks包中的Lock和Condition接口的類(lèi),被認(rèn)為是high-level的并發(fā)對(duì)象,對(duì)這樣的對(duì)象使用內(nèi)置鎖是有問(wèn)題的做法,盡管看起來(lái)代碼的功能是正確的。風(fēng)險(xiǎn):基于high-level并發(fā)類(lèi)庫(kù)的內(nèi)置鎖實(shí)現(xiàn)同步,會(huì)因?yàn)椴灰恢碌逆i規(guī)則而導(dǎo)致不確定的行為。
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下線程API(THI)(1)不要直接調(diào)用Thread.run()(2)不要調(diào)用ThreadGroup中的一些方法(3)通知所有等待中的線程而不是單一線程(4)不要使用Thread.stop()來(lái)終止線程不要捕獲NullPointerException規(guī)范描述:?jiǎn)?dòng)一個(gè)新線程應(yīng)該調(diào)用Thread的start方法。如果直接調(diào)用Thread的run方法,run方法中的語(yǔ)句是由當(dāng)前線程而不是新創(chuàng)建的線程來(lái)執(zhí)行的。風(fēng)險(xiǎn):不能正確地啟動(dòng)線程會(huì)導(dǎo)致預(yù)期外的行為。
不符合規(guī)則的代碼示例如下
符合規(guī)則的代碼示例如下
不要調(diào)用ThreadGroup中的一些方法規(guī)范描述:Java中每個(gè)線程都會(huì)賦予一個(gè)線程組,ThreadGroup提供了對(duì)于同一線程組的線程進(jìn)行同時(shí)操作的便利方法。但ThreadGroup中很多方法是不提倡使用的(如resume、stop、suspend等),還有一些危險(xiǎn)但不反對(duì)使用的方法如ThreadGroup.activeCount()、ThreadGroup.enumerate()等。風(fēng)險(xiǎn):使用ThreadGroupAPI可能導(dǎo)致競(jìng)態(tài)、內(nèi)存泄露及不一致的對(duì)象狀態(tài)。通知所有等待中的線程而不是單一線程規(guī)范描述:Object的notify()和notifyAll()分別用來(lái)喚醒等待中(調(diào)用了Object.wait())的一個(gè)或多個(gè)線程。notifyAll()方法會(huì)喚醒所有等待同一對(duì)象鎖的線程,notify()只喚醒一個(gè)線程,并不保證哪一個(gè)線程會(huì)接到通知。如果沒(méi)有滿足等候條件,那么選中的線程會(huì)繼續(xù)等待,這樣就違背了通知的目的。同樣的,java.util.concurrent.locks的Condition.signal()和Condition.signalAll()用來(lái)喚醒調(diào)用時(shí)Condition.await()受阻的線程。風(fēng)險(xiǎn):可能會(huì)違背程序的目的。不要使用Thread.stop()來(lái)終止線程規(guī)范描述:調(diào)用該方法將導(dǎo)致釋放該線程持有的所有鎖,可能會(huì)暴露這些鎖保護(hù)的對(duì)象。不符合規(guī)則的代碼示例如下64輸入輸出(FIO)(1)檢查和處理與文件相關(guān)的錯(cuò)誤(2)程序終止前刪除臨時(shí)文件(3)檢查和處理與文件相關(guān)的錯(cuò)誤(4)使用wrap()或duplicate()方法創(chuàng)建的緩沖區(qū)不要暴露給不受信任的代碼(5)從一個(gè)流中讀取字符或字節(jié)與-1的比較檢查和處理與文件相關(guān)的錯(cuò)誤規(guī)范描述:Ja
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通運(yùn)輸部所屬事業(yè)單位2026年度第三批統(tǒng)一公開(kāi)招聘?jìng)淇碱}庫(kù)完整答案詳解
- 2025年云南大學(xué)附屬中學(xué)星耀學(xué)校招聘?jìng)淇碱}庫(kù)參考答案詳解
- 2025年溫州銀行金華東陽(yáng)支行(籌)運(yùn)營(yíng)主管備考題庫(kù)完整參考答案詳解
- java課程設(shè)計(jì)(計(jì)算器)
- 2025江西省建工集團(tuán)有限責(zé)任公司所屬企業(yè)招聘12人考試重點(diǎn)試題及答案解析
- 2025福建莆田市公安局下半年面向社會(huì)及退役軍人招聘警務(wù)輔助人員148人備考核心題庫(kù)及答案解析
- 2025北京大學(xué)電子學(xué)院招聘1名勞動(dòng)合同制工作人員考試重點(diǎn)題庫(kù)及答案解析
- 2025四川綿陽(yáng)市安州區(qū)人民醫(yī)院第四次招聘4人筆試重點(diǎn)題庫(kù)及答案解析
- 2025年兒童托管師資五年職業(yè)發(fā)展:培訓(xùn)與考核報(bào)告
- 2025 九年級(jí)語(yǔ)文下冊(cè)文言文省略主語(yǔ)補(bǔ)充課件
- 社區(qū)警務(wù)工作復(fù)習(xí)測(cè)試附答案
- 《民航法律法規(guī)》課件-7-2 民用航空器不安全事件的處置
- 2024秋期國(guó)家開(kāi)放大學(xué)《西方行政學(xué)說(shuō)》一平臺(tái)在線形考(任務(wù)一至四)試題及答案
- 2024秋國(guó)家開(kāi)放大學(xué)《交通工程》形考任務(wù)1-4答案
- 創(chuàng)新設(shè)計(jì)前沿智慧樹(shù)知到期末考試答案章節(jié)答案2024年浙江大學(xué)
- 股東合作合同模板
- 中國(guó)書(shū)法藝術(shù)智慧樹(shù)知到期末考試答案章節(jié)答案2024年中國(guó)美術(shù)學(xué)院
- 小學(xué)生古詩(shī)詞大賽備考題庫(kù)(300題)
- DB14-T 2644-2023旅游氣候舒適度等級(jí)劃分與評(píng)價(jià)方法
- 藥店食品安全管理制度目錄
- GB/T 25085.3-2020道路車(chē)輛汽車(chē)電纜第3部分:交流30 V或直流60 V單芯銅導(dǎo)體電纜的尺寸和要求
評(píng)論
0/150
提交評(píng)論