軟件開發(fā)編碼規(guī)范方案_第1頁
軟件開發(fā)編碼規(guī)范方案_第2頁
軟件開發(fā)編碼規(guī)范方案_第3頁
軟件開發(fā)編碼規(guī)范方案_第4頁
軟件開發(fā)編碼規(guī)范方案_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、軟件安全開發(fā)編碼規(guī)1. 代碼編寫1) 開發(fā)人員應保證工程中不存在無用的資源(如代碼、圖片文件等)。2) 代碼中每個類名上的注釋必須留下創(chuàng)建者和修改者的名字。3) 每個需要import的類都應使用一行import聲明,不得使用import xxx.*。4) System.out.println()僅在調(diào)試時使用,正式代碼里不應出現(xiàn)。5) 開發(fā)人員編寫代碼時應遵循以下命名規(guī)則:l Package 名稱應該都是由一組小寫字母組成;l Class 名稱中的每個單詞的首字母必須大寫;l Static Final 變量的名稱全用大寫,并且名稱后加注釋;l 參數(shù)的名稱必須和變量的命名規(guī)一致;l 使用有意義的

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

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

4、出任何保證。遵循這些準則可能好的實踐,但是即使遵循了這些準則,寫出的代碼仍然可能是不安全的。風險永遠存在,不管在編寫代碼時是如何的警覺。這些準則的目標,不是為了保證代碼的安全性,而是為了消除若干特定類型攻擊帶來的風險。遵循這些準則,某些特定類型的攻擊將無法實現(xiàn);但是其它類型的攻擊仍然可能成功。因此遵循這些準則僅僅是安全的第一步。當書寫可能和非守信或混用的代碼時,應當仔細的考慮如下準則:n 靜態(tài)字段n 縮小作用域n 公共方法和字段n 保護包n 盡可能使對象不可變(immutable)n 序列化n 清除敏感信息1) 靜態(tài)字段避免使用非final的公共靜態(tài)變量,應盡可能地避免使用非final公共靜態(tài)

5、變量,因為無法判斷代碼有無權(quán)限改變這些靜態(tài)變量的值。一般地,應謹慎使用可變的靜態(tài)狀態(tài),因為這可能導致設想中應該相互獨立的子系統(tǒng)之間發(fā)生不曾預期的交互。2) 縮小作用域作為一個慣例,盡可能縮小成員方法和成員變量的作用域。檢查包訪問權(quán)限成員(package-private)能否改成私有成員(private),保護訪問成員(protected)可否改成包訪問權(quán)限成員(package-private)/私有成員(private)等等。3) 公共方法/字段公共變量應當避免使用,訪問這些變量時應當通過getter/setter法。在這種方式下,必要時可以增加集中的安全檢查。任何能夠訪問或修改任何敏感部狀態(tài)

6、的公共方法,務必包含安全檢查。參考如下代碼段,該代碼段中不可信任代碼可能修改TimeZone的值:private static TimeZone defaultZone = null;public static synchronized void setDefault(TimeZone zone)defaultZone = zone;4) 保護包有時需要整體上保護一個包以避免不可信任代碼的訪問,本節(jié)描述了一些防護技術(shù):u 防止包注入:如果不可信任代碼想要訪問類的包保護成員,可能通過在被攻擊的包定義自己的新類用以獲取這些成員的訪問權(quán)的方式。防止這類攻擊的方式有兩種:a. 通過向java.secu

7、perties文件中加入如下文字防止包被注入惡意類。.package.definition=Package#1 ,Package#2,.,Package#n.當檢測到代碼試圖在包定義新類時,類裝載器的defineClass方法會拋出異常,除非代碼被賦予以下權(quán)限:. RuntimePermission("defineClassInPackage."+package).b. 另一種方式是通過將包放到封閉的JAR(sealed Jar)文件里。(參看java.sun./j2se/sdk/1.2/docs/guide/extensions/spec.html)通過使

8、用這種技巧,代碼無法獲得擴展包的權(quán)限,因此也無須修改perties文件。u 防止包訪問:可以通過限制包訪問但同時僅賦予特定代碼訪問權(quán)限防止不可信任代碼對包成員的訪問。通過向perties文件中加入如下文字可以達到這一目的:. package.access=Package#1 ,Package#2,.,Package#n.當檢測到代碼試圖訪問上述包中的類時,類加載器的loadClass方法會拋出異常,除非代碼被賦予以下權(quán)限:. RuntimePermission("defineClassInPackage."

9、+package).5) 盡可能使對象不可變(immutable)盡可能使對象不可變。如果對象必須改變,使得它們可以克隆并在方法調(diào)用時返回副本。如果方法調(diào)用的返回對象是數(shù)組、向量或哈希表等,牢記這些對象并非不可變,調(diào)用者可以修改這些對象的容并導致安全漏洞。此外,不可變的對象因為不用上鎖所以能夠提高并發(fā)性。不要返回包含敏感數(shù)據(jù)的部數(shù)組引用。這個不可變慣例的變型,在這兒提出是因為是個常見錯誤。即使數(shù)組中包含不可變的對象比如說是字符串,也要返回一個副本,這樣調(diào)用者不能修改數(shù)組中包含的到底是哪個字符串。在方法調(diào)用返回時,返回數(shù)據(jù)的拷貝而不要返回數(shù)組。6) 不要直接在用戶提供的數(shù)組里存儲這是不可變慣例的

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論