出版時(shí)間:2013-6 出版社:機(jī)械工業(yè)出版社 作者:Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda 譯者:計(jì)文柯,楊曉春
Tag標(biāo)簽:無
內(nèi)容概要
《java安全編碼標(biāo)準(zhǔn)》是java安全編碼領(lǐng)域最權(quán)威、最全面、最詳細(xì)的著作,java之父james a. gosling推薦。不僅從語言角度系統(tǒng)而詳細(xì)地闡述java安全編碼的要素、標(biāo)準(zhǔn)、規(guī)范和最佳實(shí)踐,而且從架構(gòu)設(shè)計(jì)的角度分析了java api存在的設(shè)計(jì)缺陷和可能存在的安全風(fēng)險(xiǎn),以及應(yīng)對的策略和措施。可以將本書作為java安全方面的工具書,根據(jù)自己的需要,找到自己感興趣的規(guī)則進(jìn)行閱讀和理解,或者在實(shí)際開發(fā)中遇到安全問題時(shí),根據(jù)書中列出的大致分類對規(guī)則進(jìn)行索引和閱讀,也可以通讀全書的所有規(guī)則,系統(tǒng)地了解java安全規(guī)則,增強(qiáng)對java安全特性、語言使用、運(yùn)行環(huán)境特性的理解。本書能指導(dǎo)java軟件工程師設(shè)計(jì)出高質(zhì)量的、安全的、可靠的、強(qiáng)大的、有彈性的、可用性和可維護(hù)性高的軟件系統(tǒng)。
作者簡介
Fred Long 英國Aberystwyth大學(xué)計(jì)算機(jī)科學(xué)系高級講師和教學(xué)主任。主要講授形式方法、Java、C++和C的編程模式以及與編程相關(guān)的安全問題的課程。他是英國計(jì)算機(jī)協(xié)會中威爾士分會的主席,自1992年以來在軟件工程研究所(SEI)擔(dān)任客座研究員。最近正在研究如何在Java中探查安全性漏洞。
Dhruv Mohindra 印度Persistent系統(tǒng)工程有限公司的高級軟件工程師。曾研發(fā)了廣泛應(yīng)用于企業(yè)服務(wù)器的監(jiān)控軟件。曾在SEI的CERT項(xiàng)目工作,并致力于在編程社區(qū)中提高對安全問題的警覺性。曾任職于卡內(nèi)基·梅隆大學(xué),擁有信息安全策略與管理碩士學(xué)位和印度Pune大學(xué)計(jì)算機(jī)工程學(xué)士學(xué)位。
Robert C. Seacord 資深計(jì)算機(jī)安全專家和作家。在計(jì)算機(jī)安全、歷史系統(tǒng)改造以及基于組件的軟件工程等領(lǐng)域具有極深的造詣。目前管理卡內(nèi)基·梅隆大學(xué)SEI的CERT在安全編碼領(lǐng)域的創(chuàng)新項(xiàng)目。擁有Rensselaer Polytechnic學(xué)院計(jì)算機(jī)科學(xué)學(xué)士學(xué)位。
Dean F. Sutherland CERT高級軟件安全工程師,編譯器后端技術(shù)專家組高級專家。擁有卡內(nèi)基·梅隆大學(xué)博士學(xué)位。曾擔(dān)任職業(yè)軟件工程師,在Tartan公司工作超過14年。
David Svoboda CERT軟件安全工程師,資深Java開發(fā)工程師,在Java開發(fā)領(lǐng)域擁有13年的開發(fā)經(jīng)驗(yàn)。是卡內(nèi)基·梅隆大學(xué)的一系列軟件開發(fā)項(xiàng)目的主要開發(fā)者,這些項(xiàng)目涉及從層級芯片建模到社會組織仿真再到自動(dòng)機(jī)器學(xué)習(xí)等多個(gè)方面。
書籍目錄
《java安全編碼標(biāo)準(zhǔn)》
譯者序
序
前言
致謝
第1章 概述1
1.1 錯(cuò)位的信任1
1.2 注入攻擊2
1.3 敏感數(shù)據(jù)泄露3
1.4 效能泄露5
1.5 拒絕服務(wù)6
1.6 序列化8
1.7 并發(fā)性、可見性和內(nèi)存8
1.8 最低權(quán)限原則14
1.9 安全管理器15
1.10 類裝載器16
1.11 小結(jié)16
第2章 輸入驗(yàn)證和數(shù)據(jù)凈化(ids)17
規(guī)則17
風(fēng)險(xiǎn)評估概要17
.2.1 ids00-j凈化穿越受信邊界的非受信數(shù)據(jù)18
2.2 ids01-j驗(yàn)證前標(biāo)準(zhǔn)化字符串26
2.3 ids02-j在驗(yàn)證之前標(biāo)準(zhǔn)化路徑名28
2.4 ids03-j不要記錄未經(jīng)凈化的用戶輸入31
2.5 ids04-j限制傳遞給zipinputstream的文件大小33
2.6 ids05-j使用ascii字符集的子集作為文件名和路徑名35
2.7 ids06-j從格式字符串中排除用戶輸入37
2.8 ids07-j不要向runtime.exec()?方法傳遞非受信、未凈化的數(shù)據(jù)38
2.9 ids08-j凈化傳遞給正則表達(dá)式的非受信數(shù)據(jù)41
2.10 ds09-j如果沒有指定適當(dāng)?shù)膌ocale,不要使用locale相關(guān)方法處理與locale相關(guān)的數(shù)據(jù)44
2.11 ids10-j不要拆分兩種數(shù)據(jù)結(jié)構(gòu)中的字符串45
2.12 ids11-j在驗(yàn)證前去掉非字符碼點(diǎn)50
2.13 ids12-j在不同的字符編碼中無損轉(zhuǎn)換字符串?dāng)?shù)據(jù)51
2.14 ids13-j在文件或者網(wǎng)絡(luò)i/o兩端使用兼容的編碼方式53
第3章 聲明和初始化(dcl)56
規(guī)則56
風(fēng)險(xiǎn)評估概要56
3.1 dcl00-j防止類的循環(huán)初始化56
3.2 dcl01-j不要重用java標(biāo)準(zhǔn)庫的已經(jīng)公開的標(biāo)識59
3.3 dcl02-j將所有增強(qiáng)for語句的循環(huán)變量聲明為final類型60
第4章 表達(dá)式(exp)63
規(guī)則63
風(fēng)險(xiǎn)評估概要63
4.1 exp00-j不要忽略方法的返回值63
4.2 exp01-j不要解引用空指針65
4.3 exp02-j使用兩個(gè)參數(shù)的arrays.equals()方法來比較兩個(gè)數(shù)組的內(nèi)容67
4.4 exp03-j不要用相等操作符來比較兩個(gè)基礎(chǔ)數(shù)據(jù)類型的值67
4.5 exp04-j確保使用正確的類型來自動(dòng)封裝數(shù)值72
4.6 exp05-j不要在一個(gè)表達(dá)式中對同一變量進(jìn)行多次寫入73
4.7 exp06-j不要在斷言中使用有副作用的表達(dá)式76
第5章 數(shù)值類型與運(yùn)算(num)78
規(guī)則78
風(fēng)險(xiǎn)評估概要78
5.1 num00-j檢測和避免整數(shù)溢出79
5.2 num01-j不要對同一數(shù)據(jù)進(jìn)行位運(yùn)算和數(shù)學(xué)運(yùn)算85
5.3 num02-j確保除法運(yùn)算和模運(yùn)算中的除數(shù)不為088
5.4 num03-j使用可容納無符號數(shù)據(jù)合法取值范圍的整數(shù)類型89
5.5 num04-j不要使用浮點(diǎn)數(shù)進(jìn)行精細(xì)計(jì)算90
5.6 num05-j不要使用非標(biāo)準(zhǔn)化數(shù)92
5.7 num06-j使用strictfp修飾符確??缙脚_浮點(diǎn)運(yùn)算的一致性94
5.8 num07-j不要嘗試與nan進(jìn)行比較97
5.9 num08-j檢查浮點(diǎn)輸入特殊的數(shù)值98
5.10 num09-j不要使用浮點(diǎn)變量作為循環(huán)計(jì)數(shù)器100
5.11 num10-j不要從浮點(diǎn)字元構(gòu)造bigdecimal對象101
5.12 num11-j不要比較或者審查以字符串表達(dá)的浮點(diǎn)數(shù)值102
5.13 num12-j確保將數(shù)值轉(zhuǎn)換成較小類型時(shí)不會產(chǎn)生數(shù)據(jù)丟失或曲解103
5.14 num13-j轉(zhuǎn)換基本整數(shù)類型至浮點(diǎn)類型時(shí)應(yīng)避免精度損失107
第6章 面向?qū)ο螅╫bj)110
規(guī)則110
風(fēng)險(xiǎn)評估概要110
6.1 obj00-j只有受信子類能對具有不變性的類和方法進(jìn)行擴(kuò)展111
6.2 obj01-j聲明數(shù)據(jù)成員為私有并提供可訪問的封裝器方法116
6.3 obj02-j當(dāng)改變基類時(shí),保存子類之間的依賴關(guān)系118
6.4 obj03-j在新代碼中,不要混用具有泛型和非泛型的原始數(shù)據(jù)類型124
6.5 obj04-j為可變類提供復(fù)制功能,并通過此功能允許將實(shí)例傳遞給非受信代碼128
6.6 obj05-j在返回引用之前,防御性復(fù)制私有的可變的類成員132
6.7 obj06-j對可變輸入和可變的內(nèi)部組件創(chuàng)建防御性復(fù)制136
6.8 obj07-j不允許敏感類復(fù)制其自身138
6.9 obj08-j不要在嵌套類中暴露外部類的私有字段141
6.10 obj09-j比較類而不是類名稱143
6.11 obj10-j不要使用公有靜態(tài)的非final變量144
6.12 obj11-j小心處理構(gòu)造函數(shù)拋出異常的情況146
第7章 方法(met)153
規(guī)則153
風(fēng)險(xiǎn)評估概要153
7.1 met00-j驗(yàn)證方法參數(shù)154
7.2 met01-j不要使用斷言驗(yàn)證方法參數(shù)156
7.3 met02-j不要使用棄用的或過時(shí)的類和方法157
7.4 met03-j進(jìn)行安全檢測的方法必須聲明為private或final158
7.5 met04-j不要增加被覆寫方法和被隱藏方法的可訪問性160
7.6 met05-j確保構(gòu)造函數(shù)不會調(diào)用可覆寫的方法161
7.7 met06-j不要在clone()中調(diào)用可覆寫的方法163
7.8 met07-j不要定義類方法來隱藏基類或基類接口中聲明的方法165
7.9 met08-j確保比較等同的對象能得到相等的結(jié)果167
7.10 met09-j定義了equlas()方法的類必須定義hashcode()方法174
7.11 met10-j實(shí)現(xiàn)compareto()方法時(shí)遵守常規(guī)合約176
7.12 met11-j確保比較中的關(guān)鍵碼是不可變的178
7.13 met12-j不要使用析構(gòu)函數(shù)182
第8章 異常行為(err)187
規(guī)則187
風(fēng)險(xiǎn)評估概要187
8.1 err00-j不要消除或忽略可檢查的異常187
8.2 err01-j不能允許異常泄露敏感信息192
8.3 err02-j記錄日志時(shí)應(yīng)避免異常196
8.4 err03-j在方法失敗時(shí)恢復(fù)對象先前的狀態(tài)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
規(guī)則219
風(fēng)險(xiǎn)評估概要219
9.1 vna00-j當(dāng)需要讀取共享基礎(chǔ)數(shù)據(jù)類型變量時(shí),需要保證其可見性219
9.2 vna01-j保證對一個(gè)不可變對象的共享引用的可見性222
9.3 vna02-j保證對于共享變量的組合操作是原子性的225
9.4 vna03-j即使每一個(gè)方法都是相互獨(dú)立并且是原子性的,也不要假設(shè)一組調(diào)用是原子性的230
9.5 vna04-j保證串聯(lián)在一起的方法調(diào)用是原子性的235
9.6 vna05-j保證在讀寫64位的數(shù)值時(shí)的原子性239
第10章 鎖(lck)241
規(guī)則241
風(fēng)險(xiǎn)評估概要241
10.1 lck00-j通過私有final鎖對象可以同步那些與非受信代碼交互的類242
10.2 lck01-j不要基于那些可能被重用的對象進(jìn)行同步246
10.3 lck02-j不要基于那些通過getclass()返回的類對象來實(shí)現(xiàn)同步249
10.4 lck03-j不要基于高層并發(fā)對象的內(nèi)置鎖來實(shí)現(xiàn)同步252
10.5 lck04-j即使集合是可訪問的,也不要基于集合視圖使用同步253
10.6 lck05-j對那些可以被非受信代碼修改的靜態(tài)字段,需要同步進(jìn)入255
10.7 lck06-j不要使用一個(gè)實(shí)例鎖來保護(hù)共享靜態(tài)數(shù)據(jù)256
10.8 lck07-j使用相同的方式請求和釋放鎖來避免死鎖258
10.9 lck08-j在異常條件時(shí),保證釋放已經(jīng)持有的鎖266
10.10 lck09-j不要執(zhí)行那些持有鎖時(shí)會阻塞的操作270
10.11 lck10-j不要使用不正確形式的雙重鎖定檢查慣用法273
10.12 lck11-j當(dāng)使用那些不能對鎖策略進(jìn)行承諾的類時(shí),避免使用客戶端鎖定277
第11章 線程api(thi)282
規(guī)則282
風(fēng)險(xiǎn)評估概要282
11.1 thi00-j不要調(diào)用thread.run()282
11.2 thi01-j不能調(diào)用threadgroup方法284
11.3 thi02-j通知所有等待中的線程而不是單一線程287
11.4 thi03-j始終在循環(huán)中調(diào)用wait()和await()方法292
11.5 thi04-j確??梢越K止受阻線程295
11.6 thi05-j不要使用thread.stop()來終止線程300
第12章 線程池(tps)304
規(guī)則304
風(fēng)險(xiǎn)評估概要304
12.1 tps00-j使用線程池處理流量突發(fā)以實(shí)現(xiàn)降低性能運(yùn)行304
12.2 tps01-j不要使用有限的線程池來執(zhí)行相互依賴的任務(wù)307
12.3 tps02-j確保提交至線程池的任務(wù)是可中斷的312
12.4 tps03-j確保線程池中正在執(zhí)行的任務(wù)不會失敗而不給出任何提示315
12.5 tps04-j使用線程池時(shí),確保threadlocal變量可以重新初始化318
第13章 與線程安全相關(guān)的其他規(guī)則(tsm)323
規(guī)則323
風(fēng)險(xiǎn)評估概要323
13.1 tsm00-j不要使用非線程安全方法來覆寫線程安全方法323
13.2 tsm01-j不要讓this引用在創(chuàng)建對象時(shí)泄漏326
13.3 tsm02-j不要在初始化類時(shí)使用后臺線程332
13.4 tsm03-j不要發(fā)布部分初始化的對象336
第14章 輸入輸出(fio)342
規(guī)則342
風(fēng)險(xiǎn)評估概要342
14.1 fio00-j不要操作共享目錄中的文件343
14.2 fio01-j使用合適的訪問權(quán)限創(chuàng)建文件351
14.3 fio02-j發(fā)現(xiàn)并處理與文件相關(guān)的錯(cuò)誤352
14.4 fio03-j在終止前移除臨時(shí)文件354
14.5 fio04-j在不需要時(shí)關(guān)閉資源357
14.6 fio05-j不要使用wrap()或duplicate()創(chuàng)建緩存,并將這些緩存暴露給非受信代碼361
14.7 fio06-j不能在一個(gè)單獨(dú)的inputstream上創(chuàng)建多個(gè)緩存區(qū)封裝器364
14.8 fio07-j不要讓外部進(jìn)程阻塞輸入和輸出流367
14.9 fio08-j對讀取一個(gè)字符或者字節(jié)的方法,使用int類型的返回值370
14.10 fio09-j不要使用write()方法輸出超過0~255的整數(shù)372
14.11 fio10-j使用read()方法保證填充一個(gè)數(shù)組373
14.12 fio11-j不要將原始的二進(jìn)制數(shù)據(jù)作為字符數(shù)據(jù)讀入375
14.13 fio12-j為小端數(shù)據(jù)的讀寫提供方法376
14.14 fio13-j不要在受信邊界之外記錄敏感信息379
14.15 fio14-j在程序終止時(shí)執(zhí)行正確的清理動(dòng)作381
第15章 序列化(ser)387
規(guī)則387
風(fēng)險(xiǎn)評估概要387
15.1 ser00-j在類的演化過程中維護(hù)其序列化的兼容性388
15.2 ser01-j不要偏離序列化方法的正確簽名390
15.3 ser02-j在將對象向信任邊界之外發(fā)送時(shí),需要簽名并且封裝敏感對象392
15.4 ser03-j不要序列化未經(jīng)加密的敏感數(shù)據(jù)397
15.5 ser04-j不要允許序列化和反序列化繞過安全管理器401
15.6 ser05-j不要序列化內(nèi)部類實(shí)例404
15.7 ser06-j在反序列化時(shí),對私有的可變的組件進(jìn)行防御性復(fù)制405
15.8 ser07-j不要對實(shí)現(xiàn)定義的不可變因素使用默認(rèn)的序列化格式406
15.9 ser08-j在從擁有特性的環(huán)境中進(jìn)行反序列化之前最小化特權(quán)410
15.10 ser09-j不要從readobject()方法中調(diào)用可以被覆寫的方法413
15.11 ser10-j在序列化時(shí),避免出現(xiàn)內(nèi)存和資源泄漏414
15.12 ser11-j防止覆蓋外部化的對象415
第16章 平臺安全性(sec)417
規(guī)則417
風(fēng)險(xiǎn)評估概要417
16.1 sec00-j不要允許特權(quán)代碼塊越過受信邊界泄露敏感信息417
16.2 sec01-j不要在特權(quán)代碼塊中使用污染過的變量420
16.3 sec02-j不要基于非受信源進(jìn)行安全檢查422
16.4 sec03-j不要在允許非受信代碼裝載任意類之后裝載受信類424
16.5 sec04-j使用安全管理器檢查來保護(hù)敏感操作426
16.6 sec05-j不要使用反射來增加類、方法和字段的可訪問性429
16.7 sec06-j不要依賴于默認(rèn)的由urlclassloader和java.util.jar提供的自動(dòng)化簽名檢查434
16.8 sec07-j當(dāng)編寫一個(gè)自定義的類裝載器時(shí)調(diào)用基類的getpermissions()方法437
16.9 sec08-j定義基于原生方法的封裝器438
第17章 運(yùn)行環(huán)境(env)441
規(guī)則441
風(fēng)險(xiǎn)評估概要441
17.1 env00-j不要簽名只執(zhí)行非特權(quán)操作的代碼441
17.2 env01-j將所有安全敏感的代碼置于單獨(dú)一個(gè)jar包中,并且在簽名之后封裝它443
17.3 env02-j不要信任環(huán)境變量的值446
17.4 env03-j不要賦予危險(xiǎn)的權(quán)限組合448
17.5 env04-j不要關(guān)閉字節(jié)碼驗(yàn)證功能451
17.6 env05-j不要部署一個(gè)被遠(yuǎn)程監(jiān)視的應(yīng)用452
第18章 其他(msc)457
規(guī)則457
風(fēng)險(xiǎn)評估概要457
18.1 msc00-j在交換安全數(shù)據(jù)時(shí)使用sslsocket而不是socket457
18.2 msc01-j不要使用空的無限循環(huán)461
18.3 msc02-j生成強(qiáng)隨機(jī)數(shù)462
18.4 msc03-j不要硬編碼敏感信息464
18.5 msc04-j防止內(nèi)存泄漏466
18.6 msc05-j不要耗盡堆空間473
18.7 msc06-j當(dāng)一個(gè)遍歷正在進(jìn)行時(shí),不要修改它對應(yīng)的集合477
18.8 msc07-j防止多次實(shí)例化單例對象481
術(shù)語表490
參考資源497
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載
Java安全編碼標(biāo)準(zhǔn) PDF格式下載