軟件開(kāi)發(fā)編碼規(guī)范_第1頁(yè)
軟件開(kāi)發(fā)編碼規(guī)范_第2頁(yè)
軟件開(kāi)發(fā)編碼規(guī)范_第3頁(yè)
軟件開(kāi)發(fā)編碼規(guī)范_第4頁(yè)
軟件開(kāi)發(fā)編碼規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩4頁(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、中譯語(yǔ)通(青島)科技有限公司軟件開(kāi)發(fā)編程規(guī)范軟件安全開(kāi)發(fā)編碼規(guī)范1. 代碼編寫1) 開(kāi)發(fā)人員應(yīng)保證工程中不存在無(wú)用的資源(如代碼、圖片文件等)。2) 代碼中每個(gè)類名上的注釋必須留下創(chuàng)建者和修改者的名字。3) 每個(gè)需要import的類都應(yīng)使用一行import聲明,不得使用import xxx.*。4) System.out.println()僅在調(diào)試時(shí)使用,正式代碼里不應(yīng)出現(xiàn)。5) 開(kāi)發(fā)人員編寫代碼時(shí)應(yīng)遵循以下命名規(guī)則:l Package 名稱應(yīng)該都是由一組小寫字母組成;l Class 名稱中的每個(gè)單詞的首字母必須大寫;l Static Final 變量的名稱全用大寫,并且名稱后加注釋;l 參數(shù)

2、的名稱必須和變量的命名規(guī)范一致;l 使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名稱。6) 代碼應(yīng)該用unix的格式,而不是windows的。7) exit 除了在 main 中可以被調(diào)用外,其他的地方不應(yīng)被調(diào)用。8) 代碼中應(yīng)盡量使用interfaces,不要使用abstract類。9) 在需要換行的情況下,盡量使用 println 來(lái)代替在字符串中使用的"n"。10) 涉及HTML的文檔,盡量使用XHTML1.0 transitional文件類型,其中所有HTML標(biāo)簽都應(yīng)關(guān)閉。11) 在HTML、JavaScript、XML代碼中,縮進(jìn)應(yīng)為兩個(gè)空格,不得

3、使用Tab。12) HTML標(biāo)簽的name和id屬性的命名方式應(yīng)與Java變量名相同。13) 在需要經(jīng)常創(chuàng)建開(kāi)銷較大的對(duì)象時(shí),開(kāi)發(fā)人員應(yīng)考慮使用對(duì)象池。14) 在進(jìn)行l(wèi)og的獲取時(shí)開(kāi)發(fā)人員應(yīng)盡量使用isXXXEnabled。15) log的生成環(huán)境上盡量避免輸出文件名和行號(hào)。16) 產(chǎn)品中不要包含后門代碼,隔離系統(tǒng)中的后門代碼,確保其不能出現(xiàn)在產(chǎn)品中。作為一種特殊的調(diào)試代碼,后門訪問(wèn)代碼是為了使開(kāi)發(fā)者和測(cè)試工程師訪問(wèn)一部分終端用戶不能訪問(wèn)的程序代碼。但是,如果后門代碼被留到產(chǎn)品中,對(duì)攻擊者來(lái)說(shuō),它就是一條不需要通過(guò)正常安全手段來(lái)攻陷系統(tǒng)的通路。2. JAVA安全遵循下面列出的準(zhǔn)則有利于編寫更加

4、安全的代碼。但是總體來(lái)說(shuō),這些準(zhǔn)則不能對(duì)安全性做出任何保證。遵循這些準(zhǔn)則可能好的實(shí)踐,但是即使遵循了這些準(zhǔn)則,寫出的代碼仍然可能是不安全的。風(fēng)險(xiǎn)永遠(yuǎn)存在,不管在編寫代碼時(shí)是如何的警覺(jué)。這些準(zhǔn)則的目標(biāo),不是為了保證代碼的安全性,而是為了消除若干特定類型攻擊帶來(lái)的風(fēng)險(xiǎn)。遵循這些準(zhǔn)則,某些特定類型的攻擊將無(wú)法實(shí)現(xiàn);但是其它類型的攻擊仍然可能成功。因此遵循這些準(zhǔn)則僅僅是安全的第一步。當(dāng)書寫可能和非守信鏈接或混用的代碼時(shí),應(yīng)當(dāng)仔細(xì)的考慮如下準(zhǔn)則:n 靜態(tài)字段n 縮小作用域n 公共方法和字段n 保護(hù)包n 盡可能使對(duì)象不可變(immutable)n 序列化n 清除敏感信息1) 靜態(tài)字段避免使用非final的

5、公共靜態(tài)變量,應(yīng)盡可能地避免使用非final公共靜態(tài)變量,因?yàn)闊o(wú)法判斷代碼有無(wú)權(quán)限改變這些靜態(tài)變量的值。一般地,應(yīng)謹(jǐn)慎使用可變的靜態(tài)狀態(tài),因?yàn)檫@可能導(dǎo)致設(shè)想中應(yīng)該相互獨(dú)立的子系統(tǒng)之間發(fā)生不曾預(yù)期的交互。2) 縮小作用域作為一個(gè)慣例,盡可能縮小成員方法和成員變量的作用域。檢查包訪問(wèn)權(quán)限成員(package-private)能否改成私有成員(private),保護(hù)訪問(wèn)成員(protected)可否改成包訪問(wèn)權(quán)限成員(package-private)/私有成員(private)等等。3) 公共方法/字段公共變量應(yīng)當(dāng)避免使用,訪問(wèn)這些變量時(shí)應(yīng)當(dāng)通過(guò)getter/setter法。在這種方式下,必要時(shí)可以

6、增加集中的安全檢查。任何能夠訪問(wèn)或修改任何敏感內(nèi)部狀態(tài)的公共方法,務(wù)必包含安全檢查。參考如下代碼段,該代碼段中不可信任代碼可能修改TimeZone的值:private static TimeZone defaultZone = null;public static synchronized void setDefault(TimeZone zone)defaultZone = zone;4) 保護(hù)包有時(shí)需要整體上保護(hù)一個(gè)包以避免不可信任代碼的訪問(wèn),本節(jié)描述了一些防護(hù)技術(shù):u 防止包注入:如果不可信任代碼想要訪問(wèn)類的包保護(hù)成員,可能通過(guò)在被攻擊的包內(nèi)定義自己的新類用以獲取這些成員的訪問(wèn)權(quán)的方式。

7、防止這類攻擊的方式有兩種:a. 通過(guò)向perties文件中加入如下文字防止包內(nèi)被注入惡意類。.package.definition=Package#1 ,Package#2,.,Package#n.當(dāng)檢測(cè)到代碼試圖在包內(nèi)定義新類時(shí),類裝載器的defineClass方法會(huì)拋出異常,除非代碼被賦予以下權(quán)限:. RuntimePermission("defineClassInPackage."+package).b. 另一種方式是通過(guò)將包放到封閉的JAR(sealed Jar)文件里。(參看通過(guò)使用這種技巧,代碼無(wú)法獲得擴(kuò)展包的權(quán)限,因此也無(wú)須修

8、改perties文件。u 防止包訪問(wèn):可以通過(guò)限制包訪問(wèn)但同時(shí)僅賦予特定代碼訪問(wèn)權(quán)限防止不可信任代碼對(duì)包成員的訪問(wèn)。通過(guò)向perties文件中加入如下文字可以達(dá)到這一目的:. package.access=Package#1 ,Package#2,.,Package#n.當(dāng)檢測(cè)到代碼試圖訪問(wèn)上述包中的類時(shí),類加載器的loadClass方法會(huì)拋出異常,除非代碼被賦予以下權(quán)限:. RuntimePermission("defineClassInPackage."+package).5) 盡可能使對(duì)象不可變(im

9、mutable)盡可能使對(duì)象不可變。如果對(duì)象必須改變,使得它們可以克隆并在方法調(diào)用時(shí)返回副本。如果方法調(diào)用的返回對(duì)象是數(shù)組、向量或哈希表等,牢記這些對(duì)象并非不可變,調(diào)用者可以修改這些對(duì)象的內(nèi)容并導(dǎo)致安全漏洞。此外,不可變的對(duì)象因?yàn)椴挥蒙湘i所以能夠提高并發(fā)性。不要返回包含敏感數(shù)據(jù)的內(nèi)部數(shù)組引用。這個(gè)不可變慣例的變型,在這兒提出是因?yàn)槭莻€(gè)常見(jiàn)錯(cuò)誤。即使數(shù)組中包含不可變的對(duì)象比如說(shuō)是字符串,也要返回一個(gè)副本,這樣調(diào)用者不能修改數(shù)組中包含的到底是哪個(gè)字符串。在方法調(diào)用返回時(shí),返回?cái)?shù)據(jù)的拷貝而不要返回?cái)?shù)組。6) 不要直接在用戶提供的數(shù)組里存儲(chǔ)這是不可變慣例的另一個(gè)變型。構(gòu)造器和方法可以接受對(duì)象數(shù)組,比如

10、說(shuō)PubicKey數(shù)組,這個(gè)數(shù)據(jù)存儲(chǔ)到內(nèi)部之前應(yīng)當(dāng)克隆,并保存克隆后的數(shù)據(jù),而不是直接將數(shù)組引用賦給同樣類型的內(nèi)部變量。如果缺少這個(gè)步驟,在使用了有問(wèn)題的構(gòu)造器創(chuàng)建了對(duì)象后,用戶對(duì)外部數(shù)組所作的任何修改都將更改對(duì)象的內(nèi)部狀態(tài),盡管對(duì)象應(yīng)該是不可變的。7) 序列化對(duì)象在序列化后、反序列化之前,都不在Java運(yùn)行時(shí)環(huán)境的控制之下,也因此不在Java平臺(tái)提供的安全控制范圍內(nèi)。在實(shí)現(xiàn)接口Serializable時(shí)務(wù)必將以下事宜牢記在心:u transient直接引用系統(tǒng)資源的句柄和包含了地址空間相關(guān)信息的字段應(yīng)當(dāng)使用關(guān)鍵字transient修飾。資源,如文件句柄,如果不被聲明為transient,該對(duì)

11、象在序列化狀態(tài)下可能會(huì)被修改,從而在被反序列化后獲取對(duì)資源的不當(dāng)訪問(wèn)。u 特定類的序列化/反序列化方法為了確保反序列化對(duì)象不包含違反一些不變量集合的狀態(tài),類應(yīng)該定義自己的反序列化方法并使用接口ObjectInputValidation驗(yàn)證這些變量。如果一個(gè)類定義了自己的序列化方法,它就不能向任何DataInput/DataOuput方法傳遞內(nèi)部數(shù)組。所有的DataInput/DataOuput方法都能被重寫。注意默認(rèn)序列化不會(huì)向DataInput/DataOuput字節(jié)數(shù)組方法暴露私有字節(jié)數(shù)組字段。如果Serializable類直接向DataOutput(write(byte b)方法傳遞了一

12、個(gè)私有數(shù)組,那么黑客可以創(chuàng)建ObjectOutputStream的子類并覆蓋write(byte b)方法,這樣他可以訪問(wèn)并修改私有數(shù)組。下面示例說(shuō)明了這個(gè)問(wèn)題。示例類:public class YourClass implements Serializable private byte internalArray;.private synchronized void writeObject(ObjectOutputStream stream) .stream.write(internalArray);.黑客代碼:public class HackerObjectOutputStream ex

13、tends ObjectOutputStreampublic void write (byte b) Modify b.YourClass yc = new YourClass();.HackerObjectOutputStream hoos = new HackerObjectOutputStream();hoos.writeObject(yc);u 字節(jié)流加密另一種保護(hù)位于虛擬機(jī)之外的字節(jié)流的方式是對(duì)序列化產(chǎn)生的流進(jìn)行加密。字節(jié)流加密可以防止解碼和讀取被序列化對(duì)象的私有狀態(tài)。如果決定加密,需要管理好密鑰,密鑰的存儲(chǔ)以及密鑰交付給反序列化程序的方式,等等。u 需要注意的其它事宜如果不可信任代

14、碼在創(chuàng)建對(duì)象時(shí)受到約束,務(wù)必確保不可信任代碼在反序列化對(duì)象時(shí)受到相同的約束。牢記對(duì)象反序列化是創(chuàng)建對(duì)象的另一途徑。比如說(shuō),如果applet創(chuàng)建了frame,在該frame上創(chuàng)建了警告標(biāo)簽。如果該frame被應(yīng)用程序序列化并被applet反序列化,務(wù)必使該frame在反序列化后標(biāo)有相同的警告標(biāo)簽。8) 本地方法應(yīng)從以下幾個(gè)方面檢查本地方法:n 返回什么n 需要什么參數(shù)n 是否繞過(guò)了安全檢查n 是否是公共的,私有的等n 是否包含能繞過(guò)包邊界的方法調(diào)用,從而繞過(guò)包保護(hù)9) 清除敏感信息當(dāng)保存敏感信息時(shí),如信用信息,盡量保存在如數(shù)組這樣的可變數(shù)據(jù)類型中,而不是保存在字符串這樣的不可變對(duì)象中,這樣使得敏

15、感信息可以盡早顯式地被清除。不要指望Java平臺(tái)的自動(dòng)垃圾回收來(lái)做這種清除,因?yàn)榛厥掌骺赡懿粫?huì)清除這段內(nèi)存,或者很久后才會(huì)回收。盡早清除信息使得來(lái)自虛擬機(jī)外部的堆檢查攻擊變得困難。3. 數(shù)據(jù)庫(kù)安全1) 開(kāi)發(fā)人員應(yīng)盡量使用PreparedStatement,并且使用占位符?來(lái)表示參數(shù)。在使用set命令時(shí),數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序會(huì)對(duì)參數(shù)中的關(guān)鍵字進(jìn)行轉(zhuǎn)義。嚴(yán)格禁止將參數(shù)和SQL語(yǔ)句做拼接。2) 只給數(shù)據(jù)庫(kù)用戶授予其需要的最小權(quán)限,以保障數(shù)據(jù)庫(kù)服務(wù)器的安全。3) 當(dāng)使用JDBC操作數(shù)據(jù)庫(kù)時(shí),涉及到的資源包括ResultSet、Statement、Connection都必須及時(shí)關(guān)閉。4) ResultSet、

16、PreparedStatement、Connection必須依次關(guān)閉,同時(shí)三者的close方法都應(yīng)提示異常,且每個(gè)close方法都必須用try、catch來(lái)實(shí)現(xiàn)。5) 數(shù)據(jù)庫(kù)關(guān)閉的原則是:誰(shuí)創(chuàng)建的資源,誰(shuí)負(fù)責(zé)關(guān)閉。6) 應(yīng)在try代碼塊中及時(shí)關(guān)閉數(shù)據(jù)庫(kù)資源,同時(shí)finally的代碼塊中也要關(guān)閉資源,或者將一個(gè)try代碼塊拆分為多個(gè)try代碼塊,保證每個(gè)資源都能在使用完以后立即關(guān)閉。7) 數(shù)據(jù)庫(kù)表名、字段名必須大寫。8) 對(duì)于返回較大結(jié)果集的查詢,必須禁止SELECT *,在其他查詢中也應(yīng)避免使用。9) 編寫可以移植的SQL語(yǔ)句,原則如下:l 不得使用某個(gè)數(shù)據(jù)庫(kù)專用的關(guān)鍵字、函數(shù)等;l 當(dāng)必須要

17、使用某個(gè)數(shù)據(jù)庫(kù)特定的特性時(shí),需在程序運(yùn)行時(shí),先判斷當(dāng)前數(shù)據(jù)庫(kù)的類型,然后再根據(jù)數(shù)據(jù)的不同使用其特性;l 可以使用各種數(shù)據(jù)庫(kù)都支持的函數(shù)包括MIN、MAX、AVG、COUNT;l 盡量使用簡(jiǎn)單的SQL語(yǔ)句,當(dāng)因?yàn)樘厥馇闆r需要使用非常見(jiàn)SQL語(yǔ)句時(shí),應(yīng)該在多種數(shù)據(jù)庫(kù)下測(cè)試。10) 優(yōu)化SQL語(yǔ)句時(shí)開(kāi)發(fā)人員應(yīng)遵循以下原則:l 使用合適的SQL語(yǔ)句以避免不必要的關(guān)聯(lián);l 使用JDBC批量更新來(lái)優(yōu)化insert和update的性能;l 必要時(shí)可以使用對(duì)象緩存技術(shù),但是技術(shù)方案需要通過(guò)討論并且獲得批準(zhǔn)后方可執(zhí)行。11) 不得將數(shù)據(jù)庫(kù)的用戶名和密碼以明文形式存儲(chǔ)在配置文件中。12) 對(duì)于存儲(chǔ)于數(shù)據(jù)庫(kù)中的重要

18、數(shù)據(jù)以密文形式存放,可以大大增強(qiáng)數(shù)據(jù)的安全性。4. WEB安全1) 獨(dú)立、完整且集中的輸入驗(yàn)證2) 校驗(yàn)全部的程序輸入3) 校驗(yàn)全部的輸入長(zhǎng)度4) 校驗(yàn)全部的輸入類型5) 不使用任何方式處理失敗的數(shù)據(jù)6) 對(duì)HTTP所有內(nèi)容進(jìn)行校驗(yàn)7) 校驗(yàn)向用戶輸出的數(shù)據(jù) 8) 只相信服務(wù)器端校驗(yàn),客戶端校驗(yàn)只能作為補(bǔ)充9) 使用安全、統(tǒng)一的編碼或轉(zhuǎn)義方式 10) 設(shè)定有安全的權(quán)限邊界11) 校驗(yàn)被調(diào)用的后臺(tái)命令12) 校驗(yàn)被調(diào)用的文本或配置文件13) 在HTML中,一些特殊字符在頁(yè)面上顯示時(shí)必須轉(zhuǎn)義。14) 用戶界面須支持主流瀏覽器,避免因某類瀏覽器的安全問(wèn)題或者在非IE瀏覽器下用戶界面不能常駐。15) 用戶界面應(yīng)該包含公司或者產(chǎn)品標(biāo)識(shí)。16) 盡量使用 POST 而不是 GET方式。使用 HTTP POST 方法來(lái)保證 Request 參數(shù)的安全。 17) 創(chuàng)建一個(gè)默認(rèn)的錯(cuò)誤頁(yè)面 。對(duì)所有的異常構(gòu)造統(tǒng)一的錯(cuò)誤頁(yè)面,包括 HTTP錯(cuò)誤和未經(jīng)處理的異常。 18) 在默認(rèn)錯(cuò)誤頁(yè)面中使用通用的錯(cuò)誤消息。要確定錯(cuò)誤提示信息不會(huì)泄露系統(tǒng)信息和出錯(cuò)原因等敏感信息。精心構(gòu)造錯(cuò)誤提示信息來(lái)防止諸如用戶

溫馨提示

  • 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)論