第一部分 现代安全
第1章 对安全系统的需求
1. 1 "疯狂的Web网"上的应用程序
1. 2 可信计算的需要
1. 3 让每个人都参与进来
1. 3. 1 巧妙地向企业推销安全
1. 3. 2 使用搞破坏的方法
1. 4 灌输安全意识的一些主意
1. 4. 1 让老板发一封电子邮件
1. 4. 2 任命安全宣传员
1. 5 攻击者的优势和防御者的劣势
1. 5. 1 因素1:防御者必须对所有的环节都进行防御, 而攻击者可以选择最薄弱的环节
1. 5. 2 因素2:防御者只能针对已知的攻击进行防御, 而攻击者则可以探测未知的漏洞
1. 5. 3 因素3:防御者必须永远保持警惕, 而攻击者却可以随意"罢工"
1. 5. 4 因素4:防御者的活动必须遵循相应的规则, 而攻击者则可以采用一些卑鄙的手段
1. 6 本章小结
第2章 主动的安全开发过程
2. 1 不断改进开发过程
2. 2 安全教育的角色
2. 2. 1 强制培训的阻力
2. 2. 2 不断更新的培训
2. 2. 3 安全科学的进步
2. 2. 4 教育证明"更多的眼睛"不代表更安全
2. 2. 5 有力的证据1
2. 3 设计阶段
2. 3. 1 面试期间的安全问题
2. 3. 2 定义产品的安全目标
2. 3. 3 安全是产品的一种特性
2. 3. 4 要有足够的时间考虑安全问题
2. 3. 5 安全的设计源于威胁建模
2. 3. 6 终结不安全的特性
2. 3. 7 设置bug门槛
2. 3. 8 安全小组审查
2. 4 开发阶段
2. 4. 1 只有核心成员能够查看新代码(签字确认)
2. 4. 2 新代码的同级安全审查(签字确认)
2. 4. 3 定义安全的编码准则
2. 4. 4 审查旧的缺陷
2. 4. 5 外部安全审查
2. 4. 6 安全推动活动
2. 4. 7 留心自己的错误数量
2. 4. 8 记录错误
2. 4. 9 没有惊喜, 也没有圣诞节彩蛋!
2. 5 测试阶段
2. 6 发行和维护阶段
2. 6. 1 如何知道已完成
2. 6. 2 响应过程
2. 6. 3 责任制
2. 7 本章小结
第3章 赖以生存的安全法则
3. 1 设计安全. 默认安全和部署安全
3. 1. 1 设计安全
3. 1. 2 默认安全
3. 1. 3 部署安全
3. 2 安全法则
3. 2. 1 从错误中吸取教训
3. 2. 2 尽可能缩小攻击面
3. 2. 3 采用安全的默认设置
3. 2. 4 纵深防御
3. 2. 5 使用最小特权
3. 2. 6 向下兼容总是不安全的
3. 2. 7 假设外部系统是不安全的
3. 2. 8 失败时的应对计划
3. 2. 9 失败时进入安全模式
3. 2. 10 切记:安全特性不等于安全的特性
3. 2. 11 决不要将安全仅维系于隐匿
3. 2. 12 不要将代码与数据混在一起
3. 2. 13 正确地解决安全问题
3. 3 本章小结
第4章 威胁建模
4. 1 通过威胁建模进行安全的设计
4. 1. 1 成立威胁建模小组
4. 1. 2 分解应用程序
4. 1. 3 确定系统所面临的威胁
4. 1. 4 以风险递减的顺序给威胁分级
4. 1. 5 选择应付威胁的方法
4. 1. 6 选择缓和威胁的方法
4. 2 安全技术
4. 2. 1 身份认证
4. 2. 2 授权
4. 2. 3 防篡改和增强保密性的技术
4. 2. 4 保护秘密或最好不要保存秘密
4. 2. 5 加密. 散列. MAC和数字签名
4. 2. 6 审核
4. 2. 7 过滤. 节流和服务质量
4. 2. 8 最小特权
4. 3 缓和工资表范例程序的威胁
4. 4 各种威胁及解决方案
4. 5 本章小结
第二部分 安全的编码技术
第5章 头号公敌:缓冲区溢出
5. 1 堆栈溢出
5. 2 堆溢出
5. 3 数组下标错误
5. 4 格式字符串错误
5. 5 Unicode和ANSI缓冲区大小不匹配
5. 6 预防缓冲区溢出
5. 6. 1 字符串处理方面的安全问题
5. 6. 2 关于字符串处理函数的警告
5. 7 VisualC++. NET的/GS选项
5. 8 本章小结
第6章 确定适当的访问控制
6. 1 ACL何以如此重要
6. 2 ACL的组成
6. 3 选择好的ACL的方法
6. 4 创建ACL
6. 4. 1 在WindowsNT4中创建ACL
6. 4. 2 在Windows 2000中创建ACL
6. 4. 3 用活动模板库创建ACL
6. 5 对ACE进行正确的排序
6. 6 留意终端服务器和远程桌面的SID
6. 7 NULLDACL和其他的危险ACE类型
6. 7. 1 NULLDACL和审核
6. 7. 2 危险的ACE类型
6. 7. 3 如果无法改变NULLDACL该怎么办
6. 8 其他的访问控制机制
6. 8. 1 . NET框架角色
6. 8. 2 COM+角色
6. 8. 3 IP限制
6. 8. 4 SQLServer触发器和权限
6. 8. 5 一个医学方面的示例
6. 8. 6 关于访问控制机制的重要说明
6. 9 本章小结
第7章 以最小特权运行
7. 1 现实中的最小特权
7. 1. 1 病毒和特洛伊木马
7. 1. 2 破坏Web服务器
7. 2 访问控制简介
7. 3 特权简介
7. 3. 1 SeBackupPrivilege问题
7. 3. 2 SeRestorePrivilege问题
7. 3. 3 SeDebugPrivilege问题
7. 3. 4 SeTcbPrivilege问题
7. 3. 5 SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilegeI司题
7. 3. 6 SeLoadDriverPrivilege问题
7. 3. 7 SeRemoteShutdownPrivilege问题
7. 3. 8 SeTakeOwnershipPrivilege问题
7. 4 令牌简介
7. 5 令牌. 特权. SID, ACL和进程之间的关系
7. 6 应用程序要求提高特权的三个理由
7. 6. 1 ACL问题
7. 6. 2 特权问题
7. 6. 3 使用LSA秘密
7. 7 解决提高特权的问题
7. 7. 1 解决ACL问题
7. 7. 2 解决特权问题
7. 7. 3 解决LSA问题
7. 8 确定适当特权的过程
7. 8. 1 步骤1:找到应用程序使用的资源
7. 8. 2 步骤2:找到应用程序使用的特权API
7. 8. 3 步骤3:哪一个帐户是必需的
7. 8. 4 步骤4:获取令牌的内容
7. 8. 5 步骤5:所有SID和特权是否都是必需的
7. 8. 6 步骤6:调整令牌
7. 9 WindowsXP和WindowsServer2003中的低特权级服务帐户
7. 10 模拟特权和WindowsServer2003
7. 11 调试最小特权问题
7. 11. 1 为什么以普通用户运行时应用程序失败
7. 11. 2 如何判断应用程序失败的原因
7. 12 本章小结
第8章 加密的弱点
8. 1 使用不良的随机数
8. 1. 1 问题:rand函数
8. 1. 2 Win32中的加密随机数
8. 1. 3 托管代码中的加密随机数
8. 1. 4 Web页中的加密随机数
8. 2 使用口令生成加密密钥
8. 3 密钥管理问题
8. 3. 1 长期密钥和短期密钥
8. 3. 2 使用合适的密钥长度保护数据
8. 3. 3 将密钥保存在靠近数据源的地方
8. 3. 4 密钥交换问题
8. 4 创建自己的加密函数
8. 5 使用相同的流密码加密密钥
8. 5. 1 人们为什么使用流密码
8. 5. 2 流密码的缺陷
8. 5. 3 如果必须使用相同的密钥怎么办
8. 6 针对流密码的位替换攻击
8. 6. 1 解决位替换攻击
8. 6. 2 何时使用散列. 密钥散列或数字签名
8. 7 重用明文和密文的缓冲区
8. 8 使用加密技术缓和威胁
8. 9 在文档中说明你使用的加密算法
8. 10 本章小结
第9章 保护机密数据
9. 1 攻击机密数据
9. 2 有时并不需要保存秘密
9. 2. 1 创建干扰散列
9. 2. 2 使用PKCS#5增加攻击的难度
9. 3 获取用户的秘密信息
9. 4 保护Windows 2000及其以后版本中的秘密信息
9. 5 保护WindowsNT4中的秘密信息
9. 6 保护Windows95/98/ME/CE中的秘密
9. 7 不要选择最低共同点解决方案
9. 8 管理内存中的秘密
9. 8. 1 编译器优化警告
9. 8. 2 对内存中的机密数据进行加密
9. 9 锁定内存以防敏感数据被分页
9. 10 保护托管代码中的机密数据
9. 11 提高安全门槛
9. 11. 1 把数据存储在FAT系统的文件中
9. 11. 2 使用嵌入密钥和XOR对数据进行编码
9. 11. 3 使用嵌入密钥和3DES加密数据
9. 11. 4 使用3DES加密数据并把密码存放在注册表中
9. 11. 5 使用3DES加密数据并把强密钥存储在注册表中
9. 11. 6 使用3DES加密数据, 把强密钥存储在注册表中, 并使用ACL控制文件和注册表项
9. 11. 7 使用3DES加密数据, 把强密钥存储在注册表中, 要求用户输入密码, 并使用ACL控制文件和注册表项
9. 12 保护机密数据时的折衷方案
9. 13 本章小结
第10章 一切输入都是有害的
10. 1 问题
10. 2 误信他人
10. 3 防御输入攻击的策略
10. 4 如何检查合法性
10. 5 Perl中被污染的变量
10. 6 使用正则表达式检查输入
10. 7 正则表达式和Unicode
10. 8 正则表达式的"罗塞塔石碑"
10. 8. 1 Perl中的正则表达式
10. 8. 2 托管代码中的正则表达式
10. 8. 3 脚本中的正则表达式
10. 8. 4 C++中的正则表达式
10. 9 不使用正则表达式的最佳做法
10. 10 本章小结
第11章 规范表示的问题
11. 1 规范的含义及其存在的问题
11. 2 规范文件名的问题
11. 2. 1 绕过Napster名称过滤
11. 2. 2 Apple Mac OS X和Apache的漏洞
11. 2. 3 DOS设备名漏洞
11. 2. 4 Sun公司的StarOffice/tmp目录的符号链接漏洞
11. 2. 5 常见的Windows规范文件名错误
11. 3 基于Web的规范问题
11. 3. 1 绕过AOL的父母控制
11. 3. 2 绕过eEye的安全检查
11. 3. 3 安全区域和IE4的"无点IP地址"错误
11. 3. 4 IIS4. 0的::$DATA漏洞
11. 3. 5 何时一行变成了两行
11. 3. 6 另一个Web问题--转义
11. 4 视觉等效攻击和同形异义词攻击
11. 5 预防规范化错误
11. 5. 1 不要根据文件名进行决策
11. 5. 2 使用正则表达式限制文件名的格式
11. 5. 3 停止生生8. 3格式的文件名
11. 5. 4 不要相信PATH环境变量, 要使用完整的路径名
11. 5. 5 尝试规范化文件名
11. 5. 6 安全地调用CreateFile
11. 6 基于Web的规范化问题的补救措施
11. 6. 1 限制合法输入
11. 6. 2 处理UTF-8字符时要谨慎
11. 6. 3 ISAPI一岩石和硬地之间
11. 7 最后的考虑:非基于文件的规范化问题
11. 7. 1 服务器名
11. 7. 2 用户名
11. 8 本章小结
第12章 数据库输入问题
12. 1 问题
12. 2 伪补救措施1, 用引号将输入括起来
12. 3 伪补救措施3:使用存储过程
12. 4 补救措施1:永不以sysadmin身份连接
12. 5 补救措施2:以安全的方式创建SQL语句
12. 6 纵深防御示例
12. 7 本章小结
第13章 Web特有的输入问题
13. 1 跨网站脚本:输出何时变坏了
13. 1. 1 有时攻击者不需要<SCRIPT>块
13. 1. 2 攻击者不需要用户点击链接!
13. 2 与XSS有关的其他攻击
13. 2. 1 针对本地文件的XSS攻击
13. 2. 2 针对HTML资源的XSS攻击
13. 3 XSS的补救措施
13. 3. 1 将输出编码
13. 3. 2 为所有的标签属性加上双引号
13. 3. 3 将数据插入innerText属性
13. 3. 4 强制使用代码页
13. 3. 5 IE 6. 0 SPI的cookie选项HttpOnly
13. 3. 6 IE的"Web标记"
13. 3. 7 IE的<FRAME SECURITY>属性
13. 3. 8 ASP. NET 1. 1的ValidateRequest配置选项
13. 4 不要只是寻找不安全的结构
13. 5 我只是想让用户向我的Web站点发送
13. 6 如何审查代码中的XSS错误
13. 7 基于Web的其他安全主题
13. 7. 1 eval()可能是坏的
13. 7. 2 HTTP信任问题
13. 7. 3 ISAPI应用程序和过滤器
13. 7. 4 警惕"可预知的Cookie"
13. 7. 5 SSL/TLS客户端的问题
13. 8 本章小结
第14章 国际化问题
14. 1 I18N安全的黄金准则
14. 2 在应用程序中使用Unicode
14. 3 预防I18N缓冲区溢出
14. 4 验证I18N
14. 4. 1 视觉验证
14. 4. 2 不要使用LCMapString验证字符串
14. 4. 3 使用CreateFile验证文件名
14. 5 字符集转换问题
14. 6 调用MultiByteToWideChar时使用MB_PRECOMPOSED和MB_ERR_INVALID CHARS
14. 7 调用WideCharToMultiByte时使用WC_NO_BEST_FIT_CHARS445
14. 8 比较和排序
14. 9 Unicode字符属性
14. 10 规范化
14. 11 本章小结
第三部分 更安全的编码技术
第15章 Socket安全
15. 1 避免服务器被劫持
15. 2 TCP窗口攻击
15. 3 选择服务器接口
15. 4 接受连接
15. 5 编写防火墙友好的应用程序
15. 5. 1 只用一个连接工作
15. 5. 2 不要要求服务器连接回客户端
15. 5. 3 使用基于连接的协议
15. 5. 4 不要通过另外一个协议使你的应用程序进行多路复用
15. 5. 5 不要在应用层数据中嵌入主机IP地址
15. 5. 6 让你的应用程序可配置
15. 6 欺骗. 基于主机和基于端口的信任
15. 7 IPv6即将到来
15. 8 本章小结
第16章 RPC. ActiveX控件和DCOM安全
16. 1 RPC入门
16. 1. 1 什么是RPC
16. 1. 2 创建RPC应用程序
16. 1. 3 RPC应用程序的通信原理
16. 2 RPC安全最佳实践
16. 2. 1 使用/robust MIDL开关参数
16. 2. 2 使用[range]属性
16. 2. 3 要求对连接进行验证
16. 2. 4 使用数据包的保密性和完整性
16. 2. 5 使用严格的上下文句柄
16. 2. 6 不要依靠上下文句柄来进行访问检查
16. 2. 7 注意空的上下文句柄
16. 2. 8 不要信任你的对等端
16. 2. 9 使用安全回调
16. 2. 10 在单一进程中驻留多个RPC服务器
16. 2. 11 使用主流的协议
16. 3 DCOM安全最佳实践
16. 3. 1 DCOM基础
16. 3. 2 应用层的安全
16. 3. 3 DCOM用户上下文环境
16. 3. 4 可编程实现的安全性
16. 3. 5 源端和接收端
16. 4 ActiveX入门
16. 5 ActiveX安全最佳实践
16. 5. 1 什么样的ActiveX组件是初始化安全和脚本安全的
16. 5. 2 初始化安全和脚本安全的最佳实践
16. 6 本章小结
第17章 拒绝服务攻击的防范
17. 1 应用程序失败攻击
17. 2 CPU不足攻击
17. 3 内存不足攻击
17. 4 资源不足攻击
17. 5 网络带宽攻击
17. 6 本章小结
第18章 编写安全的. NET代码
18. 1 代码访问安全概述
18. 2 FxCop, "必备的"工具
18. 3 程序集是强命名的
18. 4 指定程序集权限需求
18. 4. 1 请求最小的权限集
18. 4. 2 拒绝不必要的权限
18. 4. 3 请求可选的权限
18. 5 过分热衷于使用Assert方法
18. 6 关于Demand和Assert方法的进一步信息
18. 7 及时禁用断言
18. 8 请求和链接请求
18. 9 慎用SuppressUnmanagedCodeSecurityAttribute属性
18. 10 远程请求
18. 11 限制代码的使用范围
18. 12 不要在XML或配置文件中存储敏感数据
18. 13 审查允许部分信任的程序集
18. 14 检查非托管代码的托管包装的正确性
18. 15 委托的问题
18. 16 序列化的问题
18. 17 隔离存储的作用
18. 18 在部署ASP. NET应用程序之前禁用跟踪和调试
18. 19 不要远程发布冗长的错误信息
18. 20 对来源不可信的数据进行反序列化
18. 21 失败时不要让攻击者知道太多
18. 22 本章小结
第四部分 特殊的安全问题
第19章 安全性测试
19. 1 安全性测试人员的角色
19. 2 安全性测试与一般测试的区别
19. 3 根据威胁模型制定安全性测试计划
19. 3. 1 分解应用程序
19. 3. 2 确定组件接口
19. 3. 3 按照潜在的漏洞对接口进行分级
19. 3. 4 确定每一个接口使用的数据结构
19. 3. 5 STRIDE类型的攻击程序
19. 3. 6 用数据变种攻击应用程序
19. 3. 7 测试之前
19. 3. 8 开发查找缺陷的工具
19. 4 用欺诈性的服务程序测试客户软件
19. 5 用户是否应看到或修改数据
19. 6 用安全模板进行测试
19. 7 发现一个错误时测试并未结束
19. 8 测试码应有很高的质量
19. 9 测试端到端解决方案
19. 10 确定攻击面
19. 10. 1 确定根攻击向量
19. 10. 2 确定攻击向量的偏差
19. 10. 3 统计产品中有偏差的攻击向量
19. 11 本章小结
第20章 审查安全代码
20. 1 处理大型应用程序
20. 2 多遍审查方法
20. 3 从易处着手
20. 4 整数溢出
20. 5 检查返回结果
20. 6 对指针代码进行额外的审查
20. 7 绝不要相信网络上的数据
20. 8 本章小结
第21章 安全的软件安装
21. 1 最小特权原则
21. 2 安装后立即清除密码
21. 3 使用安全配置编辑器
21. 4 低层的安全API
21. 5 使用Windows Installer
21. 6 本章小结
第22章 在应用程序中加入隐私策略
22. 1 对隐私的恶意侵犯和令人讨厌的侵犯
22. 2 主要的隐私立法
22. 2. 1 个人身份信息
22. 2. 2 关于数据保护的欧盟法令
22. 2. 3 安全海港原则
22. 2. 4 其他隐私立法
22. 3 隐私与安全
22. 4 建立隐私基础设施
22. 4. 1 首席隐私官的作用
22. 4. 2 隐私倡导者的作用
22. 5 设计尊重隐私的应用程序
22. 5. 1 在开发过程中加入隐私策略
22. 5. 2 了解隐私的特点
22. 6 本章小结
第23章 常用的好做法
23. 1 不要向攻击者透露任何信息
23. 2 关于服务的最佳做法
23. 2. 1 安全. 服务和交互式桌面
23. 2. 2 服务帐户准则
23. 3 不要以标志字符串的形式泄漏信息
23. 4 在补丁中改变错误信息时要谨慎
23. 5 复查错误路径
23. 6 让它保持关闭
23. 7 核心态错误
23. 7. 1 高级安全问题
23. 7. 2 句柄
23. 7. 3 符号链接
23. 7. 4 配额
23. 7. 5 序列化原语
23. 7. 6 缓冲区处理问题
23. 7. 7 IRP取消
23. 8 在代码中添加关于安全的注释
23. 9 借助于操作系统的功能
23. 10 不要依赖用户去做正确的选择
23. 11 安全地调用CreateProcess函数
23. 11. 1 不要将lpApplicationName设置为NULL
23. 11. 2 用引号把lpCommandLine中可执行文件的路径括起来
23. 12 不要创建共享的/可写的代码段
23. 13 正确使用模拟函数
23. 14 不要将用户文件写人\ProgramFiles目录
23. 15 不要把用户数据写入HKLM
23. 16 不要以"完全控制"权限打开对象
23. 17 对象创建错误
23. 18 慎用CreateFile
23. 19 安全地创建临时文件
23. 20 Setup程序和EFS文件系统的问题
23. 21 文件系统重解析点问题
23. 22 客户端安全是自相矛盾的说法
23. 23 范例就是模板
23. 24 以身作则, 亲身体验
23. 25 你得向用户负责
23. 26 基于管理员SID确定访问权限
23. 27 允许使用长口令
23. 28 慎用_alloca
23. 29 ATL转换宏
23. 30 不要嵌入公司的名称
23. 31 将字符串移至资源DLL中
23. 32 应用程序日志
23. 33 从危险的C/C++迁移到托管代码
第24章 编写安全文档和错误消息
24. 1 文档中的安全问题
24. 1. 1 关于文档的基础知识
24. 1. 2 通过文档缓和威胁
24. 1. 3 编写安全性文档的最佳做法
24. 2 错误消息中的安全问题
24. 3 典型的安全消息
24. 4 信息泄漏问题
24. 4. 1 知情同意
24. 4. 2 累进泄漏
24. 4. 3 消息要具体
24. 4. 4 最好不要提问
24. 5 对安全消息进行可用性测试
24. 6 审阅产品说明书时的注意事项
24. 7 安全设置的可用性
24. 8 本章小结
第五部分 附 录
附录A 危险的API
附录B 安全误区
附录C 设计人员的安全措施核对清单
附录D 开发人员的安全措施核对清单
附录E 测试人员的安全措施核对清单
最后的一点思考
参考文献