《java安全編碼標準》
譯者序
序
前言
緻謝
第1章 概述1
1.1 錯位的信任1
1.2 注入攻擊2
1.3 敏感數據泄露3
1.4 效能泄露5
1.5 拒絕服務6
1.6 序列化8
1.7 並發性、可見性和內存8
1.8 最低權限原則14
1.9 安全管理器15
1.10 類裝載器16
1.11 小結16
第2章 輸入驗證和數據淨化(ids)17
規則17
風險評估概要17
.2.1 ids00-j淨化穿越受信邊界的非受信數據18
2.2 ids01-j驗證前標準化字符串26
2.3 ids02-j在驗證之前標準化路徑名28
2.4 ids03-j不要記錄未經淨化的用戶輸入31
2.5 ids04-j限製傳遞給zipinputstream的文件大小33
2.6 ids05-j使用ascii字符集的子集作為文件名和路徑名35
2.7 ids06-j從格式字符串中排除用戶輸入37
2.8 ids07-j不要嚮runtime.exec()?方法傳遞非受信、未淨化的數據38
2.9 ids08-j淨化傳遞給正則錶達式的非受信數據41
2.10 ds09-j如果沒有指定適當的locale,不要使用locale相關方法處理與locale相關的數據44
2.11 ids10-j不要拆分兩種數據結構中的字符串45
2.12 ids11-j在驗證前去掉非字符碼點50
2.13 ids12-j在不同的字符編碼中無損轉換字符串數據51
2.14 ids13-j在文件或者網絡i/o兩端使用兼容的編碼方式53
第3章 聲明和初始化(dcl)56
規則56
風險評估概要56
3.1 dcl00-j防止類的循環初始化56
3.2 dcl01-j不要重用java標準庫的已經公開的標識59
3.3 dcl02-j將所有增強for語句的循環變量聲明為final類型60
第4章 錶達式(exp)63
規則63
風險評估概要63
4.1 exp00-j不要忽略方法的返迴值63
4.2 exp01-j不要解引用空指針65
4.3 exp02-j使用兩個參數的arrays.equals()方法來比較兩個數組的內容67
4.4 exp03-j不要用相等操作符來比較兩個基礎數據類型的值67
4.5 exp04-j確保使用正確的類型來自動封裝數值72
4.6 exp05-j不要在一個錶達式中對同一變量進行多次寫入73
4.7 exp06-j不要在斷言中使用有副作用的錶達式76
第5章 數值類型與運算(num)78
規則78
風險評估概要78
5.1 num00-j檢測和避免整數溢齣79
5.2 num01-j不要對同一數據進行位運算和數學運算85
5.3 num02-j確保除法運算和模運算中的除數不為088
5.4 num03-j使用可容納無符號數據閤法取值範圍的整數類型89
5.5 num04-j不要使用浮點數進行精細計算90
5.6 num05-j不要使用非標準化數92
5.7 num06-j使用strictfp修飾符確保跨平颱浮點運算的一緻性94
5.8 num07-j不要嘗試與nan進行比較97
5.9 num08-j檢查浮點輸入特殊的數值98
5.10 num09-j不要使用浮點變量作為循環計數器100
5.11 num10-j不要從浮點字元構造bigdecimal對象101
5.12 num11-j不要比較或者審查以字符串錶達的浮點數值102
5.13 num12-j確保將數值轉換成較小類型時不會産生數據丟失或麯解103
5.14 num13-j轉換基本整數類型至浮點類型時應避免精度損失107
第6章 麵嚮對象(obj)110
規則110
風險評估概要110
6.1 obj00-j隻有受信子類能對具有不變性的類和方法進行擴展111
6.2 obj01-j聲明數據成員為私有並提供可訪問的封裝器方法116
6.3 obj02-j當改變基類時,保存子類之間的依賴關係118
6.4 obj03-j在新代碼中,不要混用具有泛型和非泛型的原始數據類型124
6.5 obj04-j為可變類提供復製功能,並通過此功能允許將實例傳遞給非受信代碼128
6.6 obj05-j在返迴引用之前,防禦性復製私有的可變的類成員132
6.7 obj06-j對可變輸入和可變的內部組件創建防禦性復製136
6.8 obj07-j不允許敏感類復製其自身138
6.9 obj08-j不要在嵌套類中暴露外部類的私有字段141
6.10 obj09-j比較類而不是類名稱143
6.11 obj10-j不要使用公有靜態的非final變量144
6.12 obj11-j小心處理構造函數拋齣異常的情況146
第7章 方法(met)153
規則153
風險評估概要153
7.1 met00-j驗證方法參數154
7.2 met01-j不要使用斷言驗證方法參數156
7.3 met02-j不要使用棄用的或過時的類和方法157
7.4 met03-j進行安全檢測的方法必須聲明為private或final158
7.5 met04-j不要增加被覆寫方法和被隱藏方法的可訪問性160
7.6 met05-j確保構造函數不會調用可覆寫的方法161
7.7 met06-j不要在clone()中調用可覆寫的方法163
7.8 met07-j不要定義類方法來隱藏基類或基類接口中聲明的方法165
7.9 met08-j確保比較等同的對象能得到相等的結果167
7.10 met09-j定義瞭equlas()方法的類必須定義hashcode()方法174
7.11 met10-j實現compareto()方法時遵守常規閤約176
7.12 met11-j確保比較中的關鍵碼是不可變的178
7.13 met12-j不要使用析構函數182
第8章 異常行為(err)187
規則187
風險評估概要187
8.1 err00-j不要消除或忽略可檢查的異常187
8.2 err01-j不能允許異常泄露敏感信息192
8.3 err02-j記錄日誌時應避免異常196
8.4 err03-j在方法失敗時恢復對象先前的狀態197
8.5 err04-j不要在finally程序段非正常退齣201
8.6 err05-j不要在finally程序段中遺漏可檢查異常202
8.7 err06-j不要拋齣未聲明的可檢查異常205
8.8 err07-j不要拋齣runtimeexception、exception或throwable209
8.9 err08-j不要捕捉nullpointerexception或任何它的基類210
8.10 err09-j禁止非受信代碼終止jvm216
第9章 可見性和原子性(vna)219
規則219
風險評估概要219
9.1 vna00-j當需要讀取共享基礎數據類型變量時,需要保證其可見性219
9.2 vna01-j保證對一個不可變對象的共享引用的可見性222
9.3 vna02-j保證對於共享變量的組閤操作是原子性的225
9.4 vna03-j即使每一個方法都是相互獨立並且是原子性的,也不要假設一組調用是原子性的230
9.5 vna04-j保證串聯在一起的方法調用是原子性的235
9.6 vna05-j保證在讀寫64位的數值時的原子性239
第10章 鎖(lck)241
規則241
風險評估概要241
10.1 lck00-j通過私有final鎖對象可以同步那些與非受信代碼交互的類242
10.2 lck01-j不要基於那些可能被重用的對象進行同步246
10.3 lck02-j不要基於那些通過getclass()返迴的類對象來實現同步249
10.4 lck03-j不要基於高層並發對象的內置鎖來實現同步252
10.5 lck04-j即使集閤是可訪問的,也不要基於集閤視圖使用同步253
10.6 lck05-j對那些可以被非受信代碼修改的靜態字段,需要同步進入255
10.7 lck06-j不要使用一個實例鎖來保護共享靜態數據256
10.8 lck07-j使用相同的方式請求和釋放鎖來避免死鎖258
10.9 lck08-j在異常條件時,保證釋放已經持有的鎖266
10.10 lck09-j不要執行那些持有鎖時會阻塞的操作270
10.11 lck10-j不要使用不正確形式的雙重鎖定檢查慣用法273
10.12 lck11-j當使用那些不能對鎖策略進行承諾的類時,避免使用客戶端鎖定277
第11章 綫程api(thi)282
規則282
風險評估概要282
11.1 thi00-j不要調用thread.run()282
11.2 thi01-j不能調用threadgroup方法284
11.3 thi02-j通知所有等待中的綫程而不是單一綫程287
11.4 thi03-j始終在循環中調用wait()和await()方法292
11.5 thi04-j確保可以終止受阻綫程295
11.6 thi05-j不要使用thread.stop()來終止綫程300
第12章 綫程池(tps)304
規則304
風險評估概要304
12.1 tps00-j使用綫程池處理流量突發以實現降低性能運行304
12.2 tps01-j不要使用有限的綫程池來執行相互依賴的任務307
12.3 tps02-j確保提交至綫程池的任務是可中斷的312
12.4 tps03-j確保綫程池中正在執行的任務不會失敗而不給齣任何提示315
12.5 tps04-j使用綫程池時,確保threadlocal變量可以重新初始化318
第13章 與綫程安全相關的其他規則(tsm)323
規則323
風險評估概要323
13.1 tsm00-j不要使用非綫程安全方法來覆寫綫程安全方法323
13.2 tsm01-j不要讓this引用在創建對象時泄漏326
13.3 tsm02-j不要在初始化類時使用後颱綫程332
13.4 tsm03-j不要發布部分初始化的對象336
第14章 輸入輸齣(fio)342
規則342
風險評估概要342
14.1 fio00-j不要操作共享目錄中的文件343
14.2 fio01-j使用閤適的訪問權限創建文件351
14.3 fio02-j發現並處理與文件相關的錯誤352
14.4 fio03-j在終止前移除臨時文件354
14.5 fio04-j在不需要時關閉資源357
14.6 fio05-j不要使用wrap()或duplicate()創建緩存,並將這些緩存暴露給非受信代碼361
14.7 fio06-j不能在一個單獨的inputstream上創建多個緩存區封裝器364
14.8 fio07-j不要讓外部進程阻塞輸入和輸齣流367
14.9 fio08-j對讀取一個字符或者字節的方法,使用int類型的返迴值370
14.10 fio09-j不要使用write()方法輸齣超過0~255的整數372
14.11 fio10-j使用read()方法保證填充一個數組373
14.12 fio11-j不要將原始的二進製數據作為字符數據讀入375
14.13 fio12-j為小端數據的讀寫提供方法376
14.14 fio13-j不要在受信邊界之外記錄敏感信息379
14.15 fio14-j在程序終止時執行正確的清理動作381
第15章 序列化(ser)387
規則387
風險評估概要387
15.1 ser00-j在類的演化過程中維護其序列化的兼容性388
15.2 ser01-j不要偏離序列化方法的正確簽名390
15.3 ser02-j在將對象嚮信任邊界之外發送時,需要簽名並且封裝敏感對象392
15.4 ser03-j不要序列化未經加密的敏感數據397
15.5 ser04-j不要允許序列化和反序列化繞過安全管理器401
15.6 ser05-j不要序列化內部類實例404
15.7 ser06-j在反序列化時,對私有的可變的組件進行防禦性復製405
15.8 ser07-j不要對實現定義的不可變因素使用默認的序列化格式406
15.9 ser08-j在從擁有特性的環境中進行反序列化之前最小化特權410
15.10 ser09-j不要從readobject()方法中調用可以被覆寫的方法413
15.11 ser10-j在序列化時,避免齣現內存和資源泄漏414
15.12 ser11-j防止覆蓋外部化的對象415
第16章 平颱安全性(sec)417
規則417
風險評估概要417
16.1 sec00-j不要允許特權代碼塊越過受信邊界泄露敏感信息417
16.2 sec01-j不要在特權代碼塊中使用汙染過的變量420
16.3 sec02-j不要基於非受信源進行安全檢查422
16.4 sec03-j不要在允許非受信代碼裝載任意類之後裝載受信類424
16.5 sec04-j使用安全管理器檢查來保護敏感操作426
16.6 sec05-j不要使用反射來增加類、方法和字段的可訪問性429
16.7 sec06-j不要依賴於默認的由urlclassloader和java.util.jar提供的自動化簽名檢查434
16.8 sec07-j當編寫一個自定義的類裝載器時調用基類的getpermissions()方法437
16.9 sec08-j定義基於原生方法的封裝器438
第17章 運行環境(env)441
規則441
風險評估概要441
17.1 env00-j不要簽名隻執行非特權操作的代碼441
17.2 env01-j將所有安全敏感的代碼置於單獨一個jar包中,並且在簽名之後封裝它443
17.3 env02-j不要信任環境變量的值446
17.4 env03-j不要賦予危險的權限組閤448
17.5 env04-j不要關閉字節碼驗證功能451
17.6 env05-j不要部署一個被遠程監視的應用452
第18章 其他(msc)457
規則457
風險評估概要457
18.1 msc00-j在交換安全數據時使用sslsocket而不是socket457
18.2 msc01-j不要使用空的無限循環461
18.3 msc02-j生成強隨機數462
18.4 msc03-j不要硬編碼敏感信息464
18.5 msc04-j防止內存泄漏466
18.6 msc05-j不要耗盡堆空間473
18.7 msc06-j當一個遍曆正在進行時,不要修改它對應的集閤477
18.8 msc07-j防止多次實例化單例對象481
術語錶490
參考資源497
· · · · · · (
收起)