第1章 创建安全的Web应用程序 1
1.1 “安全性”的含义 1
1.1.1 “安全”的含义 1
1.1.2 安全的其他定义 3
1.2 重视安全性的原因 4
1.2.1 Web应用程序——一把双刃剑 4
1.2.2 相关法律 4
1.2.3 对Web应用程序的攻击方式 5
1.2.4 每个人迟早都会遭受攻击 9
1.2.5 安全并不仅仅是拦贼于门外 10
1.3 安全由谁来负责 10
1.3.1 ASP.NET开发人员力所不及的安全问题 11
1.3.2 ASP.NET开发人员的职责 12
1.4 一些安全建议 18
1.4.1 没有百分之百的安全 18
1.4.2 隐藏起来并不能保证安全 18
1.4.3 应用程序安全性由它最薄弱的环节决定 19
1.4.4 安全问题在开发过程的每一阶段都很重要 20
1.4.5 安全领域有做不完的工作 20
1.4.6 过分限制的安全不利于产品开发 21
1.4.7 安全并不只是技术问题 21
1.4.8 维护安全不能依赖用户 22
1.5 小结 22
第2章 认真对待客户 24
2.1 攻击手段 25
2.1.1 脚本注入 25
2.1.2 跨站点脚本攻击 28
2.1.3 SQL注入 32
2.1.4 SQL Union攻击 33
2.1.5 更多的高级攻击 35
2.1.6 验证、编码和筛选用户输入 36
2.1.7 预防SQL注入攻击 45
2.1.8 隐藏窗体字段 47
2.1.9 Cookies 48
2.1.10 Http Referrer 49
2.1.11 URL 51
2.1.12 视图状态 57
2.2 防止信息泄漏 58
2.2.1 控制错误信息 60
2.2.2 禁用调试和跟踪 60
2.3 小结 61
第3章 存储秘密 63
3.1 存储方式 63
3.1.1 将秘密存储到页面中 63
3.1.2 将秘密存储到后台编码文件中 64
3.1.3 将秘密存储到.config文件中 65
3.1.4 将秘密存储到受保护的.config文件中 65
3.1.5 将秘密存储到内存中 67
3.1.6 使用散列技术存储秘密 68
3.2 小结 70
3.1.7 使用Data Protection API存储秘密 70
第4章 保护数据库访问权 71
4.1 保护措施 71
4.1.1 数据库账户 71
4.1.2 限制到数据库的连接 72
4.1.3 将秘密存储到.NET组件中 72
4.1.4 COM+对象构造 74
4.1.5 使用受信任的连接 78
4.1.6 使用存储过程控制数据库访问 79
4.2 小结 82
第5章 实现密码策略 83
5.1 密码策略 83
5.1.1 如何创建安全密码 83
5.1.2 密码的最小长度 83
5.1.3 混合大小写的密码 85
5.1.4 数字和符号 86
5.1.5 对新密码运行字典检查 88
5.1.6 密码更新 94
5.1.7 为用户选择随机密码 96
5.1.8 帮助忘记密码的用户 96
5.2 防止蛮力攻击 97
5.3 小结 97
第6章 ASP.NET安全架构 99
6.1 ASP.NET安全过程 100
6.1.1 身份验证 100
6.1.2 授权 101
6.1.3 假冒 101
6.1.4 综合运用所有功能 102
6.2 如何实现NET安全 104
6.2.1 表示安全上下文 104
6.2.2 表示用户标识 106
6.2.3 ASP.NET页面请求中出现的安全事件 109
6.2.4 内置的身份验证模块 110
6.2.5 内置的授权模块 112
6.3 小结 113
第7章 Windows身份验证 115
7.1 使用Windows身份验证的原因 115
7.2 Windows身份验证的工作方式 116
7.2.1 基本身份验证 116
7.2.2 摘要身份验证 119
7.2.3 集成Windows身份验证 121
7.3 ASP.NET Windows身份验证API 122
7.3.1 WindowsAuthenticationModule类 122
7.3.2 WindowsPrincipal类 123
7.3.3 WindowsIdentity类 123
7.4 实现Windows身份验证 124
7.4.1 配置IIS以执行身份验证 124
7.4.2 配置ASP.NET以使用Windows身份验证 125
7.4.3 访问ASP.NET中的Windows用户信息 125
7.4.4 自定义Windows身份验证 127
7.5 小结 129
第8章 .NET Passport 130
8.1 使用Passport身份验证的原因 131
8.2 .NET Passport的工作原理 132
8.3 实现.NET Passport 133
8.3.1 实现.NET Passport前的准备 134
8.3.2 注册.NET Passport应用程序 134
8.3.3 Passport管理实用程序 137
8.4 Passport SDK COM对象 137
8.5 .NET Passport类 139
8.5.1 .NET Passport登录 141
8.5.2 处理Passport Cookies 142
8.6 为Passport身份验证配置ASP.NET 144
8.7 获取配置文件数据 145
8.8 自定义Passport身份验证 147
8.9 利用Passport加密和压缩 148
8.9.1 加密 149
8.9.2 压缩 149
8.10 P3P 150
8.9.3 多个密钥 150
8.11 .NET Passport的前景 151
8.12 小结 153
8.13 相关链接 153
第9章 窗体身份验证 154
9.1 使用窗体身份验证的原因 154
9.1.1 不使用窗体身份验证的原因 155
9.1.2 不用亲自实现Cookie身份验证 157
9.2 窗体身份验证的工作原理 158
9.3 窗体身份验证API 158
9.3.1 FormsAuthenticationModule HTTP模块 159
9.3.2 FormsAuthentication类 159
9.3.3 FormsIdentity类 160
9.3.4 FormsAuthenticationTicket类 161
9.4 实现窗体身份验证 162
9.4.1 重点关注SSL 162
9.4.2 配置窗体身份验证 163
9.4.3 设置登录页面 166
9.4.4 为存储器散列密码 176
9.4.5 保留身份验证Cookie 180
9.4.6 使用其他的凭证存储器 182
9.5 小结 196
第10章 扩充窗体身份验证 197
10.1 在多个服务器上使用窗体身份验证 197
10.1.1 在非Web Farm中使用这些方法 199
10.1.2 随机生成机器密钥 204
10.2 不带Cookies的窗体身份验证 207
10.3 保护.aspx页面及其内容 213
10.3.1 性能问题 215
10.3.2 与文件类型有关的问题 215
10.4 向身份验证票证添加附加信息 217
10.5 构建窗体身份验证以支持基于角色的授权 221
10.6 防止Cookie被盗 227
10.7 保存登录用户列表 230
10.8 提供多个登录页面 235
10.9 小结 239
第11章 自定义的身份验证 240
11.1 使用自定义身份验证的原因 240
11.1.1 为自定义身份验证配置ASP.NET 241
11.1.2 处理AuthenticateRequest事件 242
11.1.3 创建我们自己的主体和标识 247
11.1.4 在运行阶段附加到自定义的Principal对象 252
11.2 电话银行案例分析 255
11.2.1 将BeVocal Café作为服务提供商 260
11.2.2 SQL Server用户/账户数据库 261
11.3 小结 282
第12章 实现授权 283
12.1 角色 283
12.2 主体和标识 284
12.2.1 标识 284
12.3 基于角色的安全 285
12.2.2 主体 285
12.4 ASP.NET授权 287
12.5 文件授权 287
12.6 URL授权 290
12.7 权限的计算 293
12.8 代码中的授权检查 294
12.8.1 PrincipalPermission对象 297
12.8.3 PrincipalPermissionAttribute类 298
12.8.2 合并PrincipalPermission对象 298
12.9 自定义授权 299
12.10 CustomHttpModule 300
12.11 处理Global.asax中的AuthorizeRequest 302
12.12 在Web.config中添加CustomModule 303
12.12.1 授权失败 304
12.12.2 自定义授权示例 304
12.13 小结 308
第13章 代码访问安全 309
13.1 代码访问安全概述 310
13.2 代码访问安全的基本知识 312
13.2.1 获得程序集标识 312
13.2.2 为程序集分配权限 312
13.2.3 访问控制 314
13.3 证据 315
13.3.1 应用程序、域和程序集证据 316
13.3.2 自定义证据 317
13.4 代码访问安全权限 318
13.3.3 运行库主机 318
13.4.1 自定义权限类 321
13.4.2 标识权限 322
13.5 代码访问安全策略 323
13.5.1 权限集和代码组 324
13.5.2 内置的权限集 325
13.5.3 策略结构 327
13.5.4 策略结构对象模型 327
13.5.5 使用策略评估 328
13.5.6 定制安全策略 332
13.5.7 使用自定义证据和权限 333
13.6 代码访问安全和ASP.NET应用程序 334
13.7 代码访问安全限制 335
13.8 安全请求 336
13.9 安全需求 338
13.9.1 运行时需求 339
13.9.2 加载时安全需求 343
13.10 真实示例 344
13.10.1 解决方案的运作方式 345
13.10.2 安装指令 348
13.11 小结 348
第14章 Web服务安全 350
14.1 Web服务身份验证 350
14.1.1 在Web服务中实现身份验证 351
14.1.2 自定义SOAP身份验证 359
14.2.1 SSL 364
14.2 Web服务加密方法 364
14.2.2 SOAP 365
14.3 用于授权的基于角色的安全 370
14.4 新生技术 371
14.4.1 WS-Security 371
14.4.2 XML-签名 371
14.4.3 XML加密 372
14.6 安全确认标记语言 373
14.5 XML密钥管理规范 373
14.7 小结 374
第15章 假冒 375
15.1 需要假冒的原因 375
15.2 针对Windows 2000用户的重要注释 376
15.3 配置假冒 376
15.4 临时假冒用户 377
15.4.1 获取令牌 378
15.4.2 执行假冒 379
15.5 小结 383
附录A IIS安全性配置 384
A.1 安全性和服务器的基础结构 384
A.2 计划的安全性 385
A.3 保护IIS 386
A.3.1 设置Access Control List 387
A.3.2 禁用父路径浏览 389
A.3.3 删除IIS示例 389
A.3.4 禁用不用的COM组件 390
A.3.5 启用日志记录 390
A.3.6 安装防毒软件 391
A.4 Microsoft Data Access Component的安全性 392
A.5 锁定IIS 392
A.5.1 服务器模板 393
A.5.2 Internet服务 393
A.5.3 脚本映射 394
A.5.5 UrlScan 395
A.5.4 附加安全设置 395
A.5.6 最后的要点 397
A.6 保护Telnet 397
A.7 小结 397
附录B ASP.NET安全性配置 399
B.1 保护Windows 399
B.2 设置Windows安全性 404
B.3 URL授权 407
B.4.1 ASPNET账户权限 408
B.4 ASPNET账户 408
B.4.2 ASPNET账户限制 409
B.5 在System账户下运行 411
B.6 设置假冒 411
B.6.1 通过IIS假冒 412
B.6.2 通过身份验证假冒 415
B.6.3 通过指定的用户账户假冒 415
B.6.4 在部分代码中假冒 417
B.7 小结 419