Writing Secure Code

副标题:无

作   者:(美)Michael Howard,(美)David LeBlanc著;程永敬等译

分类号:

ISBN:9787111102854

微信扫一扫,移动浏览光盘

简介

对于“是否有这个必要”的疑问,在书中(第1章)作者是如此回答的:首先,时代在变,从“World Wide Web”(万维网)到“Wild Wild Web”(混乱无序的网)绝非文字游戏。在如今这个充满了敌意的网络环境里面,编写的代码必须经得起考验,而再用旧的思维模式去思考新的问题是非常危险的。其次,安全的产品同时也是高质量的产品,安全是高质量产品的一个子集。再次,媒体和竞争对手都喜欢在安全问题上大做文章,这些都是能上头条新闻的信息,屡屡成为牺牲品的公司不厌其烦,微软即是一个典型的例子。最后一点就是,修补安全漏洞的代价是十分高昂的。除了直接的人力和误工等损失之外,还包括改善公共关系和客户信任度的降低的损失,我把它称之为“商誉”上的损失。这四点从企业的角度对此做出了回答。 对于个人而言,也有着种种的不解(附录D):①没有人会做那事!②我们从来没有受到过攻击。③我们使用了密码、ACL和防火墙,所以安全。④检查过代码,没有安全bug。对这些问题,作者显然有着丰富的实践经验: ①当苦口婆心地告诉某个开发小组一定要做缓冲溢出测试时,大家显然不相信。于是作者现场编写了一个Perl的小脚本,它神奇地生成了一个伪造的包,发送给产品打开的Socket后,轻易地就击溃了他们的服务器。②作者与一个产品开发组工作之时,对方信誓旦旦地说他们从来没有受到过攻击,没有问题。然而就在他们被第一次攻击之时,突然就涌现了另外的数个安全漏洞。黑客的嗜好就是发现漏洞,然后广而告之,然后继续探查你的其他漏洞,问题迅速扩大化。③作者告诫大家要避免以下错误:自创“加密”算法;不安全地存储密码;使用“任何人”的ACL。防火墙只是安全体系的一环,并非全部。例如,很多攻击都是通过HTTP,也就是一个通常开放的端口来进行的。④如果不知道安全bug是什么样子,当然就没有那个问题了。 正如书中前言所提到的那样,《编写安全的代码》一书“教你以安全的方式设计、编写和测试应用程序是本书惟一的目的”,始终围绕着应用程序安全的话题进行讨论,从实践的角度对代码安全进行了全程的指导。同时,这也是“第一本指导程序员从内部加强软件安全的书籍”,是一本主要面向程序员,涉及各种攻击漏洞的安全分析,并指导人们从开发阶段即开始加强软件安全的书。在此,我把它推荐给所有关心代码安全的朋友们阅读。

目录


第一部分 现 代 安 全

第1章 对安全系统的需求 2

1.1 “wild wild web”上的应用程序 3

1.2 让每个人都参与进来 4

1.2.1 利用机智使整个组织认识到

安全的重要性 5

1.2.2 使用搞破坏的方法 7

1.3 用来灌输安全文化的一些思想 8

1.3.1 让老板发一封电子邮件 8

1.3.2 任命安全宣传员 9

第2章 设计安全的系统 12

2.1 两个常见的安全性错误 12

2.2 赖以生存的安全策略 14

2.2.1 建立一个安全步骤 14

2.2.2 定义产品的安全目标 14

2.2.3 将安全性看做是产品的一个功能 15

2.2.4 从错误中吸取教训 16

2.2.5 使用最小权限 17

2.2.6 使用纵深防御 18

.2.2.7 假设外部系统是不安全的 18

2.2.8 做好失效时的计划 18

2.2.9 失效时进入安全模式 19

2.2.10 选择安全的默认值 20

2.2.11 请记住安全性功能不等于安全

的功能 22

2.2.12 不要将安全建立在模糊信息上 22

2.2.13 最后三个观点 22

2.3 用威胁模型做安全设计 22

2.3.1 集体讨论已经知道的对系统的威胁 23

2.3.2 以风险递减的顺序给威胁排序 28

2.3.3 选择对威胁做何种反应 29

2.3.4 选择技术来缓解威胁 30

2.4 安全方法 30

2.4.1 认证 31

2.4.2 授权 34

2.4.3 抗篡改和加强保密的方法 35

2.4.4 保护秘密,更好的办法是

不存储秘密 35

2.4.5 加密、散列、mac和数字签名 36

2.4.6 审核 36

2.4.7 过滤、扼杀和服务质量 37

2.4.8 最小权限 37

2.5 回到工资应用程序范例 37

2.6 丰富的威胁和解决方案 38

第二部分 安全的编码技术

第3章 头号公敌:缓冲区溢出 44

3.1 静态缓冲区溢出 45

3.2 堆溢出 49

3.3 数组索引错误 54

3.4 格式化字符串bug 56

3.5 unicode和ansi的缓冲区大小不匹配 57

3.6 防止缓冲区溢出 58

3.7 好消息 64

第4章 确定有效的访问控制 65

4.1 acl为什么如此重要 65

4.2 acl由哪些部分组成 68

4.3 选择一种有效的acl方法 70

4.4 创建acl 72

4.4.1 在windows nt 4中创建acl 72

4.4.2 在windows 2000中创建acl 76

4.4.3 使用活动模板库创建acl 78

4.5 空的dacl以及其他危险的ace类型 80

4.5.1 空的dacl及审核 81

4.5.2 危险的ace类型 81

4.5.3 如果不能改变空dacl的话应该

怎么办 82

4.6 其他访问控制机制 83

4.6.1 ip限制 83

4.6.2 com+角色 84

4.6.3 sql server触发器和权限 85

4.6.4 一个医疗上的实例 85

4.6.5 关于访问控制机制的一点重要说明 86

第5章 使用最低权限运行 88

5.1 在实际中的最低权限 88

5.1.1 病毒和木马 89

5.1.2 破坏web服务 89

5.2 访问控制概述 90

5.3 权限概述 90

5.3.1 sebackupprivilege问题 90

5.3.2 sedebugprivilege问题 93

5.3.3 setcbprivilege问题 93

5.3.4 seassignprimarytokenprivilege

和seincreasequotaprivilege问题 93

5.4 对令牌的简短回顾 94

5.5 令牌、权限、sid、acl以及相关进程 94

5.6 确定使用恰当权限的过程 95

5.6.1 步骤1:找出应用程序所使用的资源 95

5.6.2 步骤2:找出应用程序所使用的

有特权的api 96

5.6.3 步骤3:需要哪个账号 97

5.6.4 步骤4:获取令牌的内容 97

5.6.5 步骤5:是否所有的sid和权限

都需要 102

5.6.6 步骤6:调整令牌 103

5.6.7 何时使用限定令牌 105

5.7 windows xp和windows.net server

中的低权限服务账号 111

5.8 调试的最低权限问题 112

5.8.1 为什么以普通用户运行的程序

会失败 113

5.8.2 如何确定为什么程序会失败 113

第6章 密码的缺陷 118

6.1 使用拙劣的随机数 118

6.1.1 问题:rand函数 118

6.1.2 一种补救方法:cryptgenrandom 120

6.2 用口令衍生出加密密钥 122

6.3 糟糕的密钥管理 124

6.4 使用你自己的加密函数 128

6.5 使用相同的流密码对密钥加密 130

6.5.1 人们为什么要用流密码 130

6.5.2 流密码的缺陷 130

6.5.3 你“非要”使用相同的密钥会

怎么样 133

6.6 对流密码的位替换攻击 134

6.6.1 解决位替换攻击问题 134

6.6.2 什么时候使用散列、密钥散列

或数字签名 135

6.7 对明文和密文使用同一个缓冲区 139

第7章 涉密信息的存储 140

7.1 攻击方法 140

7.2 有时你并不需要存储秘密信息 141

7.3 从用户获取秘密信息 142

7.4 在windows 2000和windows xp中

存储秘密信息 142

7.5 在windows nt 4中存储秘密信息 146

7.6 在windows 95、windows 98、windows

me和windows ce中存储秘密信息 149

7.7 提高安全限制 150

7.7.1 在fat文件系统的文件中存储

数据 150

7.7.2 利用一个嵌入密钥和xor来加

数据 150

7.7.3 利用嵌入密钥和3des加密数据 151

7.7.4 利用3des加密数据并在注册

表中存储口令 151

7.7.5 利用3des加密数据并在注册

表中存储一个强密钥 151

7.7.6 利用3des加密数据、在注册表中

存储一个强密钥并对注册表密钥

和文件进行acl处理 151

7.8 一个想法:用外部设备对秘密数据加密 151

7.8.1 一个应用ppckey的例子 151

7.8.2 ppckey威胁方式 153

第8章 规范的表示问题 157

8.1 什么是规范?为什么它存在问题 157

8.2 一点历史 157

8.2.1 绕过aol的家长控制 157

8.2.2 绕过napster的名称过滤 158

8.2.3 绕过eeye的安全检测 158

8.2.4 苹果机mac os x和apache中的漏洞 159

8.2.5 区域和ie4的“dotless-ip address”

缺陷 159

8.2.6 iis4的::$data漏洞 160

8.2.7 dos驱动名漏洞 161

8.2.8 sun 公司staroffice /tmp

目录符号连接漏洞 161

8.3 一般的windows规范化错误 162

8.3.1 长文件名的8.3格式表示方式 162

8.3.2 ntfs的另一种数据流 163

8.3.3 后缀字符 164

8.3.4 \\?\格式 164

8.3.5 目录遍历和使用父路径(..) 165

8.3.6 绝对和相对文件名 165

8.3.7 不区分大小写的文件名 165

8.3.8 设备名称和保留名称 166

8.3.9 unc共享 166

8.4 防止规范化错误的出现 166

8.4.1 不要根据名称来做出判断 167

8.4.2 使用正则表达式来限制名称的权限 167

8.4.3 尝试对名字进行规范化 170

8.5 最后的思考:基于非文件的规范化问题 173

8.5.1 服务器名 173

8.5.2 用户名 174

第三部分 基于网络的应用程序

第9章 socket安全 178

9.1 避免服务器被截听 178

9.2 选择服务器接口 184

9.3 接受连接 184

9.4 编写防火墙友好的应用程序 189

9.4.1 用一个连接工作 189

9.4.2 不要要求服务器连接回客户端 190

9.4.3 使用基于连接的协议 190

9.4.4 不要通过另外一个协议使你的应用

程序进行多路复用 190

9.4.5 不要在应用层数据中嵌入

主机ip地址 191

9.4.6 让你的应用程序可配置 191

9.5 欺骗、基于主机和基于端口的信任 191

第10章 rpc、activex控件和

dcom安全 193

10.1 rpc入门 193

10.1.1 什么是rpc 193

10.1.2 创建rpc应用程序 194

10.1.3 rpc应用程序的通信原理 195

10.2 rpc安全最佳实践 196

10.2.1 使用/robust midl开关参数 197

10.2.2 使用[range]表征项 197

10.2.3 要求对连接进行验证 197

10.2.4 使用数据包的保密性和完整性 202

10.2.5 使用严格的上下文句柄 203

10.2.6 不要依靠上下文句柄来进行

访问检查 204

10.2.7 注意空的上下文句柄 205

10.2.8 不要信任你的对端 206

10.2.9 使用安全回调 207

10.2.10 在单一进程中牵连多个rpc

服务器 208

10.2.11 考虑为你的终端添加一个注释 210

10.2.12 使用主流的协议 210

10.3 dcom安全最佳实践 210

10.3.1 dcom基础 211

10.3.2 应用层的安全 212

10.3.3 dcom用户上下文环境 213

10.3.4 可编程实现的安全性 214

10.3.5 源端和接收端 217

10.4 activex入门 218

10.5 activex安全最佳实践 218

10.5.1 什么样的activex组件是可以安全

用于初始化和脚本的 218

10.5.2 可安全用于初始化和脚本的

最佳实践 219

第11章 拒绝服务(dos)攻击的防范 222

11.1 应用程序失败攻击 222

11.2 cpu资源不足攻击 225

11.3 内存资源不足攻击 230

11.4 资源不足攻击 231

11.5 网络带宽攻击 231

第12章 基于web服务的安全 233

12.1 永远不要相信用户的输入 233

12.1.1 用户输入问题上的安全漏洞 234

12.1.2 解决用户输入问题的方法 238

12.2位web特有的规范化问题 244

12.2.1 7位和8位ascii码 244

12.2.2 十六进制转换码 244

12.2.3 utf-8可变宽编码 244

12.2.4 ucs-2 unicode编码 246

12.2.5 双重编码 246

12.2.6 html转换码 247

12.2.7 对基于web的标准化问题的解决

办法 247

12.3 其他基于web的安全性主题 250

12.3.1 http信任问题 250

12.3.2 isapi程序和过滤器 251

12.3.3 不要在web页中存储涉密数据 253

12.3.4 真的需要使用sa吗?可能不是 256

第四部分 特 殊 话 题

第13章 编写安全的.net代码 258

13.1 缓冲区溢出和clr 258

13.1.1 添加属于你自己的安全性错误处理 260

13.1.2 一个事实 261

13.2 在.net中保存涉密数据 261

13.3 总是要求适当的权限 265

13.4 过度使用assert 266

13.5 关于demand和assert的其他信息 267

13.6 不要害怕拒绝权限 268

13.7 对来自不可信任源的数据进行验证 269

13.8 asp.net中的线程支持问题 269

13.9 在部署asp.net应用程序之前要禁

用跟踪和调试 270

13.10 使用.net framework产生良好的

随机数 270

13.11 对来自不可信任源的数据进行反

串行化 271

13.12 在出现故障时,不要让攻击者获

知太多的信息 272

13.13 权衡saop 273

13.14 最后的一些想法 273

第14章 测试应用程序的安全性 274

14.1 安全测试员的作用 274

14.2 安全性测试与一般测试的区别 274

14.3 进入正题 275

14.4 建立安全性测试计划 276

14.4.1 分解应用程序 277

14.4.2 确定组件接口 277

14.4.3 依照隐患的相对大小对接口

进行排序 278

14.4.4 确定每一个接口使用的数据 279

14.4.5 通过注入错误的数据发现安全

问题 279

14.4.6 在测试之前 287

14.4.7 制作用于发现缺陷的工具 287

14.5 用欺诈性的服务程序测试客户软件 298

14.6 用户会看到或修改那些数据吗 299

14.7 用安全模板做测试 300

14.8 测试代码应该有很高的质量 301

14.9 测试端到端的解决方案 301

14.10 一些题外话:代码评审 301

第15章 安全的软件安装 302

15.1 最低权限原则 302

15.2 使用安全配置编辑器 304

15.3 低层的安全api 310

第16章 常用的好经验 311

16.1 保护客户的隐私 311

16.1.1 收集用户数据的类型 311

16.1.2 收集用户数据 312

16.2 不要告诉攻击者任何东西 313

16.3 双重检查你的错误路径 313

16.4 让它保持关闭 313

16.5 核心模式(kernel-mode)错误 313

16.5.1 使用用户模式(user-mode)

的内存 313

16.5.2 通过未受保护的ioctl访问

有特权的接口 314

16.6 考虑给代码添加安全注释 314

16.7 借助于操作系统的功能 315

16.8 不要依靠用户来做出好的设计 315

16.9 安全地调用createprocess 315

16.9.1 不要将lpapplicationname设置为

null 316

16.9.2 在lpcommandline参数中用引号

包含执行文件的路径 317

16.10 不要创建共享的/可写的

段(segment) 317

16.11 正确地使用假冒函数 317

16.12 不要在\program files目录中写用户

文件 318

16.13 不要在hklm中写用户数据 318

16.14 不要以完全控制或所有访问

的方式打开对象 318

16.15 对象创建错误 318

16.16 安全地创建临时文件 320

16.17 客户端安全是一个矛盾 322

16.18 例子是模板 323

16.19 把你的应用程序的使用者当成傻瓜 323

16.20 如果…你将其归功于你的用户 323

16.21 判断基于管理员sid的访问 323

16.22 允许使用长的口令 325

附 录

附录a 危险的api 328

附录b 十条安全法则 331

附录c 安全管理员的十条法则 337

附录d 安全的误区 342


已确认勘误

次印刷

页码 勘误内容 提交人 修订印次

Writing Secure Code
    • 名称
    • 类型
    • 大小

    光盘服务联系方式: 020-38250260    客服QQ:4006604884

    意见反馈

    14:15

    关闭

    云图客服:

    尊敬的用户,您好!您有任何提议或者建议都可以在此提出来,我们会谦虚地接受任何意见。

    或者您是想咨询:

    用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问

    Video Player
    ×
    Audio Player
    ×
    pdf Player
    ×
    Current View

    看过该图书的还喜欢

    some pictures

    解忧杂货店

    东野圭吾 (作者), 李盈春 (译者)

    亲爱的云图用户,
    光盘内的文件都可以直接点击浏览哦

    无需下载,在线查阅资料!

    loading icon