Java安全編碼通訊協定
來源:互聯網
上載者:User
《Java安全編碼通訊協定》基本資料原書名:The CERT Oracle Secure Coding Standard for Java作者: (美)Fred Long Dhruv Mohindra Robert C. Seacord Dean F. Sutherland David Svoboda譯者: 計文柯 楊曉春叢書名: 華章程式員書庫出版社:機械工業出版社ISBN:9787111428183上架時間:2013-6-13出版日期:2013 年6月開本:16開頁碼:1版次:1-1所屬分類:電腦更多關於 》》》《Java安全編碼通訊協定》內容簡介電腦書籍 《java安全編碼通訊協定》是java安全編碼領域最權威、最全面、最詳細的著作,java之父james a. gosling推薦。不僅從語言角度系統而詳細地闡述java安全編碼的要素、標準、規範和最佳實務,而且從架構設計的角度分析了java api存在的設計缺陷和可能存在的安全風險,以及應對的策略和措施。可以將本書作為java安全方面的工具書,根據自己的需要,找到自己感興趣的規則進行閱讀和理解,或者在實際開發中遇到安全問題時,根據書中列出的大致分類對規則進行索引和閱讀,也可以通讀全書的所有規則,系統地瞭解java安全規則,增強對java安全特性、語言使用、運行環境特性的理解。本書能指導java軟體工程師設計出高品質的、安全的、可靠的、強大的、有彈性的、可用性和可維護性高的軟體系統。 《java安全編碼通訊協定》內容非常全面,包括基於java se 6平台的一系列應用於java語言和類庫的安全編碼規則,並且對這一系列規則進行了分類,包括輸入資料驗證、聲明和初始化、運算式、數實值型別和操作、物件導向、方法使用、異常處理、可見度和原子性、鎖、線程、輸入輸出、序列化、平台安全特性、java運行環境等重要方面,對每一個方面所涉及的安全編碼要素、規範和標準進行了詳細闡釋。目錄《java安全編碼通訊協定》譯者序序前言致謝第1章 概述11.1 錯位的信任11.2 注入攻擊21.3 敏感性資料泄露31.4 效能泄露51.5 拒絕服務61.6 序列化81.7 並發性、可見度和記憶體81.8 最低許可權原則141.9 安全管理器151.10 類裝載器161.11 小結16第2章 輸入驗證和資料淨化(ids)17規則17風險評估概要17.2.1 ids00-j淨化穿越受信邊界的非受信資料182.2 ids01-j驗證前標準化字串262.3 ids02-j在驗證之前標準化路徑名282.4 ids03-j不要記錄未經淨化的使用者輸入312.5 ids04-j限制傳遞給zipinputstream的檔案大小332.6 ids05-j使用ascii字元集的子集作為檔案名稱和路徑名352.7 ids06-j從格式字串中排除使用者輸入372.8 ids07-j不要向runtime.exec()?方法傳遞非受信、未淨化的資料382.9 ids08-j淨化傳遞給Regex的非受信資料412.10 ds09-j如果沒有指定適當的locale,不要使用locale相關方法處理與locale相關的資料442.11 ids10-j不要拆分兩種資料結構中的字串452.12 ids11-j在驗證前去掉非字元碼點502.13 ids12-j在不同的字元編碼中無損轉換字串資料512.14 ids13-j在檔案或者網路i/o兩端使用相容的編碼方式53第3章 聲明和初始化(dcl)56規則56風險評估概要563.1 dcl00-j防止類的迴圈初始化563.2 dcl01-j不要重用java標準庫的已經公開的標識593.3 dcl02-j將所有增強for語句的迴圈變數聲明為final類型60第4章 運算式(exp)63規則63風險評估概要634.1 exp00-j不要忽略方法的傳回值634.2 exp01-j不要解引用null 指標654.3 exp02-j使用兩個參數的arrays.equals()方法來比較兩個數組的內容674.4 exp03-j不要用相等操作符來比較兩個基礎資料類型的值674.5 exp04-j確保使用正確的類型來自動封裝數值724.6 exp05-j不要在一個運算式中對同一變數進行多次寫入734.7 exp06-j不要在斷言中使用有副作用的運算式76第5章 數實值型別與運算(num)78規則78風險評估概要785.1 num00-j檢測和避免整數溢出795.2 num01-j不要對同一資料進行位元運算和數學運算855.3 num02-j確保除法運算和模運算中的除數不為0885.4 num03-j使用可容納無符號資料合法取值範圍的整數類型895.5 num04-j不要使用浮點數進行精細計算905.6 num05-j不要使用非標準化數925.7 num06-j使用strictfp修飾符確保跨平台浮點運算的一致性945.8 num07-j不要嘗試與nan進行比較975.9 num08-j檢查浮點輸入特殊的數值985.10 num09-j不要使用浮點變數作為迴圈計數器1005.11 num10-j不要從浮點字元構造bigdecimal對象1015.12 num11-j不要比較或者審查以字串表達的浮點數值1025.13 num12-j確保將數值轉換成較小類型時不會產生資料丟失或曲解1035.14 num13-j轉換基本整數類型至浮點類型時應避免精度損失107第6章 物件導向(obj)110規則110風險評估概要1106.1 obj00-j只有受信子類能對具有不變性的類和方法進行擴充1116.2 obj01-j聲明資料成員為私人並提供可訪問的封裝器方法1166.3 obj02-j當改變基類時,儲存子類之間的依賴關係1186.4 obj03-j在新代碼中,不要混用具有泛型和非泛型的未經處理資料類型1246.5 obj04-j為可變類提供複製功能,並通過此功能允許將執行個體傳遞給非受信代碼1286.6 obj05-j在返回引用之前,防禦性複製私人的可變的類成員1326.7 obj06-j對可變輸入和可變的內部組件建立防禦性複製1366.8 obj07-j不允許敏感類複製其自身1386.9 obj08-j不要在嵌套類中暴露外部類的私人欄位1416.10 obj09-j比較類而不是類名稱1436.11 obj10-j不要使用公有靜態非final變數1446.12 obj11-j小心處理建構函式拋出異常的情況146第7章 方法(met)153規則153風險評估概要1537.1 met00-j驗證方法參數1547.2 met01-j不要使用斷言驗證方法參數1567.3 met02-j不要使用棄用的或過時的類和方法1577.4 met03-j進行安全檢測的方法必須聲明為private或final1587.5 met04-j不要增加被覆寫方法和被隱藏方法的可訪問性1607.6 met05-j確保建構函式不會調用可覆寫的方法1617.7 met06-j不要在clone()中調用可覆寫的方法1637.8 met07-j不要定義類方法來隱藏基類或基類介面中聲明的方法1657.9 met08-j確保比較等同的對象能得到相等的結果1677.10 met09-j定義了equlas()方法的類必須定義hashcode()方法1747.11 met10-j實現compareto()方法時遵守常規合約1767.12 met11-j確保比較中的關鍵碼是不可變的1787.13 met12-j不要使用解構函式182第8章 異常行為(err)187規則187風險評估概要1878.1 err00-j不要消除或忽略可檢查的異常1878.2 err01-j不能允許異常泄露敏感資訊1928.3 err02-j記錄日誌時應避免異常1968.4 err03-j在方法失敗時恢複對象先前的狀態1978.5 err04-j不要在finally程式段非正常退出2018.6 err05-j不要在finally程式段中遺漏可檢查異常2028.7 err06-j不要拋出未聲明的可檢查異常2058.8 err07-j不要拋出runtimeexception、exception或throwable2098.9 err08-j不要捕捉nullpointerexception或任何它的基類2108.10 err09-j禁止非受信代碼終止jvm216第9章 可見度和原子性(vna)219規則219風險評估概要2199.1 vna00-j當需要讀取共用基礎資料類型變數時,需要保證其可見度2199.2 vna01-j保證對一個不可變對象的共用引用的可見度2229.3 vna02-j保證對於共用變數的組合操作是原子性的2259.4 vna03-j即使每一個方法都是相互獨立並且是原子性的,也不要假設一組調用是原子性的2309.5 vna04-j保證串聯在一起的方法調用是原子性的2359.6 vna05-j保證在讀寫64位的數值時的原子性239第10章 鎖(lck)241規則241風險評估概要24110.1 lck00-j通過私人final鎖對象可以同步那些與非受信代碼互動的類24210.2 lck01-j不要基於那些可能被重用的對象進行同步24610.3 lck02-j不要基於那些通過getclass()返回的類對象來實現同步24910.4 lck03-j不要基於高層並發對象的內建鎖來實現同步25210.5 lck04-j即使集合是可訪問的,也不要基於集合視圖使用同步25310.6 lck05-j對那些可以被非受信代碼修改的靜態欄位,需要同步進入25510.7 lck06-j不要使用一個執行個體鎖來保護共用待用資料25610.8 lck07-j使用相同的方式請求和釋放鎖來避免死結25810.9 lck08-j在異常條件時,保證釋放已經持有的鎖26610.10 lck09-j不要執行那些持有鎖時會阻塞的操作27010.11 lck10-j不要使用不正確形式的雙重鎖定檢查慣用法27310.12 lck11-j當使用那些不能對鎖策略進行承諾的類時,避免使用用戶端鎖定277第11章 線程api(thi)282規則282風險評估概要28211.1 thi00-j不要調用thread.run()28211.2 thi01-j不能調用threadgroup方法28411.3 thi02-j通知所有等待中的線程而不是單一線程28711.4 thi03-j始終在迴圈中調用wait()和await()方法29211.5 thi04-j確保可以終止受阻線程29511.6 thi05-j不要使用thread.stop()來終止線程300第12章 線程池(tps)304規則304風險評估概要30412.1 tps00-j使用線程池處理流量突發以實現降低效能運行30412.2 tps01-j不要使用有限的線程池來執行相互依賴的任務30712.3 tps02-j確保提交至線程池的任務是可中斷的31212.4 tps03-j確保線程池中正在執行的任務不會失敗而不給出任何提示31512.5 tps04-j使用線程池時,確保threadlocal變數可以重新初始化318第13章 與安全執行緒相關的其他規則(tsm)323規則323風險評估概要32313.1 tsm00-j不要使用非安全執行緒方法來覆寫安全執行緒方法32313.2 tsm01-j不要讓this引用在建立對象時泄漏32613.3 tsm02-j不要在初始化類時使用後台線程33213.4 tsm03-j不要發布部分初始化的對象336第14章 輸入輸出(fio)342規則342風險評估概要34214.1 fio00-j不要操作共用目錄中的檔案34314.2 fio01-j使用合適的存取權限建立檔案35114.3 fio02-j發現並處理與檔案相關的錯誤35214.4 fio03-j在終止前移除臨時檔案35414.5 fio04-j在不需要時關閉資源35714.6 fio05-j不要使用wrap()或duplicate()建立緩衝,並將這些緩衝暴露給非受信代碼36114.7 fio06-j不能在一個單獨的inputstream上建立多個緩衝區封裝器36414.8 fio07-j不要讓外部進程阻塞輸入和輸出資料流36714.9 fio08-j對讀取一個字元或者位元組的方法,使用int類型的傳回值37014.10 fio09-j不要使用write()方法輸出超過0~255的整數37214.11 fio10-j使用read()方法保證填充一個數組37314.12 fio11-j不要將原始的位元據作為字元資料讀入37514.13 fio12-j為小端資料的讀寫提供方法37614.14 fio13-j不要在受信邊界之外記錄敏感資訊37914.15 fio14-j在程式終止時執行正確的清理動作381第15章 序列化(ser)387規則387風險評估概要38715.1 ser00-j在類的演化過程中維護其序列化的相容性38815.2 ser01-j不要偏離序列化方法的正確簽名39015.3 ser02-j在將對象向信任邊界之外發送時,需要簽名並且封裝敏感對象39215.4 ser03-j不要序列化未經加密的敏感性資料39715.5 ser04-j不要允許序列化和還原序列化繞過安全管理器40115.6 ser05-j不要序列化內部類執行個體40415.7 ser06-j在還原序列化時,對私人的可變的組件進行防禦性複製40515.8 ser07-j不要對實現定義的不可變因素使用預設的序列化格式40615.9 ser08-j在從擁有特性的環境中進行還原序列化之前最小化特權41015.10 ser09-j不要從readobject()方法中調用可以被覆寫的方法41315.11 ser10-j在序列化時,避免出現記憶體和資源泄漏414