第1章 安全编程概述 1
1.1 软件的安全问题 1
1.1.1 任何软件都是不安全的 1
1.1.2 软件不安全性的几种表现 3
1.1.3 软件不安全的原因 4
1.2 在软件开发生命周期中考虑安全问题 6
1.2.1 软件设计阶段威胁建模 7
1.2.2 安全代码的编写 9
1.2.3 软件的安全性测试 9
1.2.4 漏洞响应和产品的维护 10
1.3 本书的内容 10
1.3.1 编程中的安全 10
1.3.2 针对信息安全的编程 11
1.3.3 其他内容 12
小结 12
练习 12
参考文献 12
第2章 内存安全 13
2.1 缓冲区溢出 13
2.1.1 缓冲区 13
2.1.2 缓冲区溢出 16
2.1.3 缓冲区溢出案例 18
2.1.4 堆溢出 22
2.1.5 缓冲区溢出攻击 23
2.1.6 防范方法 25
2.2 整数溢出 25
2.2.1 整数的存储方式 25
2.2.2 整数溢出 26
2.2.3 解决方案 31
2.3 数组和字符串问题 31
2.3.1 数组下标问题 31
2.3.2 字符串格式化问题 32
小结 34
练习 34
参考文献 35
第3章 线程/进程安全 36
3.1 线程机制 36
3.1.1 为什么需要线程 36
3.1.2 线程机制和生命周期 39
3.2 线程同步安全 39
3.2.1 线程同步 39
3.2.2 案例分析 40
3.2.3 解决方案 42
3.3 线程协作安全 45
3.3.1 线程协作 45
3.3.2 案例分析 45
3.3.3 解决方案 47
3.4 线程死锁安全 49
3.4.1 线程死锁 49
3.4.2 案例分析 50
3.4.3 解决方案 52
3.5 线程控制安全 53
3.5.1 安全隐患 53
3.5.2 案例分析 53
3.5.3 解决方案 55
3.6 进程安全 56
3.6.1 进程概述 56
3.6.2 进程安全问题 56
小结 57
练习 57
参考文献 57
第4章 异常/错误处理中的安全 58
4.1 异常/错误的基本机制 58
4.1.1 异常的出现 58
4.1.2 异常的基本特点 60
4.2 异常捕获中的安全 61
4.2.1 异常的捕获 61
4.2.2 异常捕获中的安全 63
4.3 异常处理中的安全 66
4.3.1 finally的使用安全 66
4.3.2 异常处理的安全 70
4.4 面向过程异常处理中的安全问题 73
4.4.1 面向过程的异常处理 73
4.4.2 安全准则 76
小结 76
练习 77
第5章 输入安全 78
5.1 一般性讨论 78
5.1.1 输入安全概述 78
5.1.2 预防不正确的输入 80
5.2 几种典型的输入安全问题 82
5.2.1 数字输入安全问题 83
5.2.2 字符串输入安全问题 83
5.2.3 环境变量输入安全问题 84
5.2.4 文件名安全问题 85
5.3 数据库输入安全问题 86
5.3.1 数据库概述 86
5.3.2 数据库的恶意输入 86
5.3.3 账户和口令问题 87
小结 88
练习 88
参考文献 89
第6章 国际化安全 90
6.1 国际化的基本机制 90
6.1.1 国际化概述 90
6.1.2 国际化过程 91
6.2 国际化中的安全问题 94
6.2.1 字符集 94
6.2.2 字符集转换 95
6.2.3 I18N缓冲区溢出问题 99
6.3 推荐使用Unicode 100
小结 101
练习 101
参考文献 101
第7章 面向对象中的编程安全 102
7.1 面向对象概述 102
7.1.1 面向对象基本原理 102
7.1.2 面向对象的基本概念 103
7.2 对象内存分配与释放 104
7.2.1 对象分配内存 104
7.2.2 对象内存释放 105
7.2.3 对象线程安全 109
7.2.4 对象序列化安全 110
7.3 静态成员安全 111
7.3.1 静态成员的机理 111
7.3.2 静态成员需要考虑的安全问题 112
7.3.3 利用单例提高程序性能 112
小结 114
练习 114
第8章 Web编程安全 115
8.1 Web概述 115
8.1.1 Web运行的原理 115
8.1.2 Web编程 116
8.2 避免URL操作攻击 117
8.2.1 URL的概念及其工作原理 117
8.2.2 URL操作攻击 118
8.2.3 解决方法 119
8.3 页面状态值安全 120
8.3.1 URL传值 120
8.3.2 表单传值 122
8.3.3 Cookie方法 125
8.3.4 session方法 128
8.4 Web跨站脚本攻击 134
8.4.1 跨站脚本攻击的原理 134
8.4.2 跨站脚本攻击的危害 140
8.4.3 防范方法 141
8.5 SQL注入 144
8.5.1 SQL注入的原理 144
8.5.2 SQL注入攻击的危害 149
8.5.3 防范方法 150
8.6 避免Web认证攻击 152
8.6.1 Web认证攻击概述 152
8.6.2 Web认证攻击防范 152
小结 153
练习 153
第9章 权限控制 154
9.1 权限控制概述 154
9.1.1 权限控制分类 154
9.1.2 用户认证方法 155
9.2 权限控制的开发 156
9.2.1 开发思想 156
9.2.2 基于代理模式的权限控制开发 157
9.2.3 基于AOP的权限控制开发 159
9.3 单点登录 159
9.3.1 单点登录概述 159
9.3.2 单点登录中账号管理 160
9.3.3 单点登录实现 161
9.4 权限控制的管理 162
小结 163
练习 163
第10章 远程调用和组件安全 165
10.1 远程调用安全 165
10.1.1 远程调用概述 165
10.1.2 安全问题 168
10.2 ActiveX安全 169
10.2.1 ActiveX概述 169
10.2.2 安全问题 170
10.3 JavaApplet安全 171
10.3.1 JavaApplet概述 171
10.3.2 安全问题 172
10.4 DCOM安全 172
10.4.1 DCOM概述 172
10.4.2 安全问题 173
10.5 EJB安全 174
10.5.1 EJB概述 174
10.5.2 开发安全的EJB 174
10.6 CORBA安全 176
10.6.1 CORBA概述 176
10.6.2 CORBA安全概述 177
小结 177
练习 178
参考文献 178
第11章 避免拒绝服务攻击 179
11.1 拒绝服务攻击 179
11.2 几个拒绝服务攻击的案例 180
11.2.1 程序崩溃攻击 180
11.2.2 资源不足攻击 182
11.2.3 恶意访问攻击 184
小结 188
练习 188
参考文献 188
第12章 数据的加密保护 189
12.1 加密概述 189
12.1.1 加密的应用 189
12.1.2 常见的加密算法 190
12.2 实现对称加密 192
12.2.1 用Java实现DES 192
12.2.2 用Java实现3DES 195
12.2.3 用Java实现AES 197
12.3 实现非对称加密 198
12.3.1 用Java实现RSA 198
12.3.2 DSA算法 201
12.4 实现单向加密 201
12.4.1 用Java实现MD5 201
12.4.2 用Java实现SHA 202
12.4.3 用Java实现消息验证码 203
12.5 密钥安全 204
12.5.1 随机数安全 205
12.5.2 密钥管理安全 207
小结 208
练习 208
参考文献 209
第13章 数据的其他保护 210
13.1 数据加密的限制 210
13.2 密码保护与验证 211
13.3 内存数据的保护 214
13.3.1 避免将数据写入硬盘文件 214
13.3.2 从内存擦除数据 217
13.4 注册表安全 217
13.4.1 注册表简介 217
13.4.2 注册表安全 218
13.5 数字水印 218
13.5.1 数字水印简介 218
13.5.2 数字水印的实现 219
13.6 软件版权保护 220
小结 221
练习 221
第14章 数字签名 222
14.1 数字签名概述 222
14.1.1 数字签名的应用 222
14.1.2 数字签名的过程 223
14.2 实现数字签名 224
14.2.1 用RSA实现数字签名 225
14.2.2 用DSA实现数字签名 226
14.3 利用数字签名解决实际问题 228
14.3.1 解决篡改问题 228
14.3.2 解决抵赖问题 232
小结 234
练习 234
第15章 软件安全测试 235
15.1 软件测试概述 235
15.1.1 软件测试的概念 235
15.1.2 软件测试的目的和意义 236
15.1.3 软件测试方法 236
15.2 针对软件安全问题的测试 238
15.2.1 软件安全测试的必要性 238
15.2.2 软件安全测试的过程 239
15.3 安全审查 242
15.3.1 代码的安全审查 242
15.3.2 配置复查 242
15.3.3 文档的安全审查 243
小结 244
练习 244
参考文献 244
第16章 程序性能调优 245
16.1 数据优化 245
16.1.1 优化变量赋值 245
16.1.2 优化字符串 246
16.1.3 选择合适的数据结构 248
16.1.4 使用尽量小的数据类型 249
16.1.5 合理使用集合 249
16.2 算法优化 250
16.2.1 优化基本运算 250
16.2.2 优化流程 252
16.3 应用优化 255
16.3.1 优化异常处理 255
16.3.2 单例 257
16.3.3 享元 257
16.3.4 延迟加载 259
16.3.5 线程同步中的优化 259
16.4 数据库的优化 260
16.4.1 设计上的优化 260
16.4.2 SQL语句优化 262
16.4.3 其他优化 266
小结 266
练习 266