《Java安全编码标准》PDF下载

  • 购买积分:16 如何计算积分?
  • 作  者:FredLong著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2013
  • ISBN:9787111428183
  • 页数:512 页
图书介绍:本书结合Java应用的开发和Java语言的使用,系统地阐述了使用Java语言时的相关安全规则。本书内容非常全面,包括基于Java标准版6.0平台(Java SE 6)环境中一系列应用于Java语言和类库的安全编码规则,并且对这一系列规则进行了分类,包括输入数据验证、声明和初始化、表达式、数值类型和操作、面向对象、方法使用、异常处理、可见性和原子性、锁、线程、输入输出、序列化、平台安全特性、Java运行环境等各个基本的分类部分。读者可以将本书作为Java安全方面的工具书,根据自己的需要,找到自己感兴趣的规则进行阅读和理解,或者在开发工作和软件设计中,遇到安全问题时,根据书中列出的大致分类对规则进行索引和阅读使用,另外,也可以通读全书的所有规则,系统地了解Java安全规则,增强对Java安全特性、语言使用、运行环境特性的理解。在国内的技术书籍中,像本书这样系统阐述Java安全的书籍并不多见,因此本书值得对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章 输入验证和数据净化(DS) 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确保除法运算和模运算中的除数不为0 88

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 NUJM09-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或final 158

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或Throwable 209

8.9 ERR08-J不要捕捉NullPointerException或任何它的基类 210

8.10 ERR09-J禁止非受信代码终止JVM 216

第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.utiljar提供的自动化签名检查 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而不是Socket 457

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