书籍详情
编写安全的代码(第二版)
作者:(美)Michael Howard,(美)David LeBlanc著;程永敬[等]译;程永敬译
出版社:机械工业出版社
出版时间:2004-12-01
ISBN:9787111112105
定价:¥55.00
购买这本书可以去
内容简介
"在过去的20年间,计算机已经彻底改变了我们的生活方式。现在,从电信业、银行业到运输业,计算机已经成为所有重要基础设施的组成部分;另外,计算机中还保存有大量的敏感数据,如个人健康记录和财务记录。为了我们的未来,现在编写安全的软件比以往更为重要,每个软件开发人员都必须学习如何将安全性集成到项目当中。微软的每个人都必须阅读《编写安全的代码》这本书,它有助于我们向客户宣传"可信计算"模式,并为开发人员正确处理安全性提供必要的基础。":比尔·盖茨微软公司首席软件架构师每年我们都会由于黑客攻击网络应用程序、窃取信用卡密码、破坏Web站点、造成网速变慢等而花费无数的金钱,并带来无尽的烦恼。通过这本引人入胜、令人耳目一新的书,读者可以学到各种安全技术来防范黑客攻击。现在,这本书已经增加了最新的安全威胁以及从微软最近的安全推广活动中获取的教训。读者将学习到如何在整个开发过程中:从设计安全的应用程序到编写健壮的代码:加固自己的应用程序,从而能够经受住探查安全隐患的测试应用程序的重复攻击。书中解释了安全法则、策略和编码技术,这些技术有助于增强代码的抗攻击能力。本书的两位作者久经沙场,他们曾解决过行业中最为棘手的一些安全问题。书中还提供了许多例子代码来说明特定的开发技术。主要内容现代安全:安全系统的需求,以及赖以生存的安全法则。新内容:使用安全编码技术进行开发,威胁建模。安全编码技术:头号公敌:缓冲区溢出,确定适当的访问控制,以最小特权运行,加密的弱点,保护机密数据,以及规范表示的问题。新内容:防止有害输入,解决数据库输入问题,基于Web的错误(包括跨站点脚本),以及国际化问题。更多的安全编码技术:Socket安全,安全DCOM、ActiveX和RPC应用程序,防范拒绝服务攻击,以及文件系统问题。新内容:使用安全编码技术开发Microsoft.NET代码。特殊话题:严格的测试安全应用程序的过程,安全的软件安装,通用的好做法。新内容:进行一次安全代码审查,在应用程序中创建隐私策略,编写完整、清晰、一致的安全文档以及有意义的错误消息。本书分为五部分。第一部分概括说明了保护系统安全的意义,以及设计安全系统的原则和所采用的技术,第二部分概括介绍了几乎适用于任何应用程序的重要编码技术,第三部分重点介绍厂网络应用程序和.Net代码安全;第四部分讨论的安全问题在一般图书中少有论及,如测试、进行安全代码审查、隐私策略以及安全的软件安装等问题,第五部分是附录,分别介绍危险的API以及分别适用于设计人员、开发人员和测试人员的安全措施核对清单。本书第1版曾作为Windows开发组全体成员的必读教材,而第2版更是总结了在针对微软产品的多次安全活动中的许多新发现。本书曾被比尔·盖茨指定为微软员工必读书籍,是软件设计、开发、测试,系统管理等人员必读的优秀教材。
作者简介
Michael Howard 《Designig secure Wed-Based for Microsift Windows 2000》的作者,致力于安全设计、安全编程和安全测试——这些都是Microsort windows开发小组中“安全Windows”倡导活动的一部分。他也是Microsoft 安全系列推广活动的架构师之一。 David LeBlanc Microsoft可信计算倡导活动的关键成员,致力于网络安全,编写网络审计工具,内部渗透测试的推广等。
目录
第一部分 现代安全
第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 测试人员的安全措施核对清单
最后的一点思考
参考文献
第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 测试人员的安全措施核对清单
最后的一点思考
参考文献
猜您喜欢