Java安全編碼標(biāo)準(zhǔn)

出版時(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格式下載


用戶評論 (總計(jì)0條)

 
 

 

250萬本中文圖書簡介、評論、評分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號-7