本书的两位作者是曾经击败过世界上最难缠的恶意黑客的代码武士,他们在书中披露了经过实战考验的保护代码安全的各种绝招。比尔·盖茨将此书钦定为“微软员工必读”。\r\n 本书分为五大部分。第一部分介绍了为什么要保护系统安全,使用权之免遭攻击,以及设计这种系统的原则和分析技术。第二部分和第三部分是本书的重点,分别介绍了几乎适用于任何一种应用程序的关键性安全编码技术,以及网络应用程序和.NET代码安全技术。第四部分讲述了一些特殊的、在一般的图书中很少讨论的安全问题。第五部分包括5个附录,分别介绍危险的API以及安全措施核对清单等。\r\n 本书告诉您应用程序怎么会不完全,为什么人们不愿意构建安全的系统,最重要的是如何构建安全的系统。\r\n 本书是软件设计、开发、测试、系统管理等人同必读的教材,也是软件学院、计算机专业或软件公司首选的软件安全教材。
第I部分 当前的安全问题\r\n\r\n第1章 人们对安全的系统的需求\r\n\r\n“野蛮网”上的应用程序\r\n对值得信赖的计算的需求\r\n在游戏中干掉对手\r\n巧妙地向企业推销安全\r\n通过颠覆推销安全\r\n灌输安全意识的一些主意\r\n向老板发送E-mail\r\n推荐一名安全传道士\r\n攻击者的优势和防御者的困境\r\n根源1:防御者必须防御所有的点而攻击者可以选择最弱的点\r\n根源2:防御者只能防御已知的攻击而攻击者可以刺探未知的弱点\r\n根源3:防御者必须始终保持警惕而攻击者可以随意地攻击\r\n根源4:防御者必须遵守游戏规则而攻击者可以不守规矩\r\n本章小结\r\n\r\n第2章 主动的安全开发过程\r\n\r\n不断改进开发过程\r\n安全教育的角色\r\n强制培训的阻力\r\n不断更新的培训\r\n安全科学的进步\r\n教育证明“更多的眼睛”不代表更安全\r\n有力的证据!\r\n设计阶段\r\n访问调查期间的安全问题\r\n定义产品的安全目标\r\n安全是产品的一种特性\r\n要有足够的时间考虑安全问题\r\n安全的设计源于威胁建模\r\n终结不安全的特性\r\n设置Bug栏\r\n安全小组审阅\r\n开发阶段\r\n只有核心成员能够查看新代码(签字确认)\r\n新代码的同级安全审查(签字确认)\r\n定义安全的编码准则\r\n审查旧的缺陷\r\n外部安全审直\r\n安全运动\r\n留心自己的错误数量\r\n记录错误\r\n没有惊喜,也没有礼物\r\n测试阶段\r\n发货和维护阶段\r\n如何知道已完成\r\n响应过程\r\n责任制\r\n本章小结\r\n\r\n第3章 赖以生存的安全法则\r\n\r\n设计、默认和部署安全(SD3)\r\n设计安全\r\n默认安全\r\n部署安全\r\n安全法则\r\n从错误中吸取教训\r\n尽可能缩小攻击面\r\n采用安全的默认设置\r\n纵深防御\r\n使用最小的特权\r\n向下兼容总是令人伤心\r\n假设外部系统是不安全的\r\n故障的应对计划\r\n安全模式失败\r\n切记:安全特性!=安全的特性\r\n决不要将安全仅维系于隐匿\r\n不要将代码与数据混合在一起\r\n正确地解决安全问题\r\n本章小结\r\n\r\n第4章 威胁建模\r\n\r\n通过威胁建模进行安全的设计\r\n成立威胁建模小组\r\n分解应用程序\r\n确定系统所面临的威胁\r\n按风险大小依次排列威胁\r\n选择应付威胁的方法\r\n选择缓和威胁的技术\r\n安全技术\r\n身分验证\r\n授权\r\n防篡改和增强保密性的技术\r\n保护秘密或最好不要保存秘密\r\n加密、哈希、MAC和数字签名\r\n审核\r\n筛选、截流和服务质量\r\n最小特权\r\n缓和工资表范例程序的威胁\r\n各种威胁及解决方案\r\n本章小结\r\n\r\n第II部分 安全的编码技术\r\n\r\n第5章 1号公敌:缓冲区溢出\r\n堆栈溢出\r\n堆溢出\r\n数组下标错误\r\n格式字符串错误\r\nUnicode和ANSI缓冲区大小不匹配\r\n一个真实的Unicode错误示例\r\n预防缓冲区溢出\r\n安全的字符串处理\r\n关于字符串处理函数的警告\r\nVisual C++ .NET的/GS选项\r\n本章小结\r\n\r\n第6章 确定适当的访问控制\r\n\r\nACL何以如此重要\r\n题外话:修复注册表代码\r\nACL的组成\r\n选择好的ACL的方法\r\n有效的拒绝ACE\r\n创建ACL\r\n在Windows NT 4中创建ACL\r\n在Windows 2000中创建ACL\r\n用活动模板库创建ACL\r\n正确排序ACE\r\n留意终端服务器和远程桌面的SID\r\nNULL DACL和其他的危险ACE类型\r\nNULL DACL和审核\r\nDangerousACETypes\r\n如果无法改变NULL DACL该怎么办\r\n其他的访问控制机制\r\n.NET框架的角色\r\nCOM+的角色\r\nIP限制\r\nSQL Server触发器和权限\r\n一个医学方面的示例\r\n关于访问控制机制的重要说明\r\n本章小结\r\n\r\n第7章 以最小特权运行\r\n\r\n现实中的最小特权\r\n病毒和特洛伊木马\r\n丑化Web服务器\r\n访问控制简介\r\n特权简介\r\nSeBackupPrivilege问题\r\nSeRestorePrivilege问题\r\nSeDebugPrivilege问题\r\nSeTcbPrivilege问题\r\nSeAssignPrimaryTokenPrivilege问题\r\nSeLoadDriverPrivilege问题\r\nseRemoteShutdownPrivilege问题\r\nSeTakeOwnershipPrivilege问题\r\n令牌简介\r\n令牌、特权、SID、ACL和进程之间的关系\r\nSID和访问检查,特权和特权检查\r\n应用程序要求提高特权的三个理由\r\nACL例题\r\n特权问题\r\n使用LSA秘密\r\n解决提高特权的问题\r\n解决ACL例题\r\n解决特权问题\r\n解决LSA问题\r\n确定适当特权的过程\r\n步骤1:找到应用程序使用的资源\r\n步骤2:找到应用程序使用的特权API\r\n步骤3:哪一个账户是必需的\r\n步骤4:获取今牌的内容\r\n步骤5:所有SID和特权是否都是必需的\r\n步骤6:调整令牌\r\nWindows XP和Windows.NET Server 2003中的低特权服务账户\r\n模拟特权和Windows.NET Server 2003\r\n调试最小特权问题\r\n为什么以普通用户运行时应用程序失败\r\n如何判断应用程序失败的原因\r\n本章小结\r\n\r\n第8章 加密的弱点\r\n\r\n使用不良的随机数\r\n问题:rand\r\nWin32中的加密随机数\r\n托管代码中的加密随机数\r\nWeb页中的加密随机数\r\n使用密码导出加密密钥\r\n测量密码的有效位长度\r\n密钥管理问题\r\n长期密钥和短期密钥\r\n使用合适的密钥长度保护数据\r\n将密钥保存在靠近数据源的地方\r\n密钥交换问题\r\n创建自己的加密函数\r\n使用相同的流码加密密钥\r\n人们为何使用流码\r\n流码的缺陷\r\n如果必须使用相同的密钥怎么办\r\n针对流码的位翻转攻击\r\n解决位翻转攻击\r\n何时使用哈希、键控哈希或数字签名\r\n重用明文和密文的缓冲区\r\n使用加密技术援和威胁\r\n在文档中说明你使用的加密算法\r\n\r\n第9章 保护机密数据\r\n\r\n攻击机密数据\r\n有时并不需要保存秘密\r\n创建伪装的哈希\r\n使用PKCS#5增加攻击的难度\r\n获取用户的秘密\r\n保护Windows 2000及其以后版本中的秘密\r\n特殊案例:Windows XP中的客户证书\r\n保护Windows NT 4中的秘密\r\n保护Windows 95/98Me/CE中的秘密\r\n使用PnP获得设备的详细资料\r\n不要选择最小公分母解决方案\r\n管理内存中的秘密\r\n编译器优化停止警告\r\n对内存中的机密数据进行加密\r\n锁定内存以防敏感数据被分页\r\n保护托管代码中的机密数据\r\n管理托管代码存放在内存中的秘密\r\n提高安全门槛\r\n把数据存储在FAT文件中\r\n使用嵌入密钥和XOR对数据进行编码\r\n使用嵌入密钥和3DES加密数据\r\n使用3DES加密数据并把密码存放在注册表中\r\n使用3DES加密数据并把强密钥存储在注册表中\r\n使用3DES加密数据把强密钥存储在注册表中并使用ACL控制文件和注册表项\r\n使用3DES加密数据把强密钥存储在注册表中要求用户输入密码并使用ACL\r\n控制文件和注册表项\r\n保护机密数据时的折衷方案\r\n本章小结\r\n\r\n第10章 一切输入都是有害的\r\n\r\n问题\r\n误信他人\r\n防御输入攻击的策略\r\n如何检查合法性\r\nPerl中被污染的变量\r\n使用正则表达式检查输入\r\n仔细检查发现的数据是否有效\r\n正则表达式和Unicode\r\n正则表达式的“罗塞塔石碑”\r\nPerl中的正则表达式\r\n托管代码中的正则表达式\r\n脚本中的正则表达式\r\nC++中的正则表达式\r\n不使用正则表达式的最佳做法\r\n本章小结\r\n\r\n第11章 规范表示的问题\r\n\r\n规范的含义及其存在的问题\r\n规范文件名的问题\r\n绕过Napster名称过滤\r\nAppleMacOSX和Apache的弱点\r\nDOS设备名的弱点\r\nSun公司的StarOffice/tmp目录的符号链接的弱点\r\n常见的Windows规范文件名错误\r\n基于Web的规范问题\r\n绕过AOL的父母控制\r\n绕过eEye的安全检查\r\n安全区域和IE 4的“无点IP地址”错误\r\nIIS 4.0的::$DATA的弱点\r\n何时一行变成了两行\r\n另一个Web问题——换码\r\n视觉等效攻击和同形异义词攻击\r\n预防规范化错误\r\n不要根据文件名进行决策\r\n使用正则表达式限制文件名的格式\r\n停止生成8.3格式的文件名\r\n不要相信PATH环境变量——使用完整的路径名\r\n尝试规范化文件名\r\n安全地调用CreateFile\r\n基于Web的规范化问题的补救措施\r\n限制合法输入\r\n处理UTF-8字符时要谨慎\r\nISAPI——岩石和硬地之间\r\n最后的考虑:非基于文件的规范化问题\r\n服务器名\r\n用户名\r\n本章小结\r\n\r\n第12章 数据库输入问题\r\n\r\n问题\r\n伪补救措施1:用引号把输入括起来\r\n伪补救措施2:使用存储过程\r\n补救措施1:永不以Sysadmin身份连接\r\n补救措施2:以安全的方式创建SQL语句\r\n以安全的方式创建SQL存储过程\r\n深层防御示例\r\n本章小结\r\n\r\n第13章 Web特有的输入问题\r\n\r\n跨网站脚本:输入何时变坏了\r\n有时攻击者不需要<SCRIPT>块\r\n攻击者不需要用户单击链接!\r\n与XSS有关的其他攻击\r\n针对本地文件的XSS攻击\r\n针对HTML资源的XSS攻击\r\nXSS的补救措施\r\n将输出编码\r\n在所有标记属性两端添加双引号\r\n将数据插入innerText属性\r\n强制使用代码页\r\nIE 6.0 SPI的cookie选项HttpOnly\r\nIE的“Web标记”\r\nIE的<FRAME SECURITY>属性\r\nASP.NET 1.1的ValidateRequest配置选项\r\n不要指望不安全的构造\r\n我只是想让用户向我的Web站点发送HTML\r\n如何审查代码中的XSS错误\r\n基于Web的其他安全主题\r\neval()可能是坏的\r\nHTTP信任问题\r\nISAPI应用程序和筛选器\r\n警惕“可预知的Cookie”\r\nSSL/TLS客户端的问题\r\n本章小结\r\n\r\n第14章 国际化问题\r\n\r\n118N安全的黄金准则\r\n在应用程序中使用Unicode\r\n预防118N缓冲区溢出\r\n字和字节\r\n验证118N\r\n可视验证\r\n不要使用LCMapString验证字符串\r\n使用CreateFile验证文件名\r\n字符集转换问题\r\n调用MultiByteToWideChar时使用MB_PRECOMPOSED和MB_HRR_INVALID_CHARS\r\n调用WideCharToMultiByte时使用WC_NO_BEST_FIT_CHARS445比较和排序\r\nUnicode字符属性\r\n范式\r\n本章小结\r\n\r\n第III部分 更安全的编码技术\r\n\r\n第15章 套接字安全\r\n\r\n避免服务器劫持\r\nTCP窗口攻击\r\n选择服务器接口\r\n接受连接\r\n编写防火墙友好的应用程序\r\n只使用一个连接\r\n不要求服务器从后端连接到客户机\r\n使用基于连接的协议\r\n不要在另一个协议上多路复用应用程序\r\n不要把主机的IP地址嵌入应用层数据\r\n使应用程序成为可配置的\r\n电子欺骗与基于主机和基于端口的信任\r\nIPv6即将发布\r\n本章小结\r\n\r\n第16章 保护RPC、ActiveX控件和DCOM\r\n\r\nRPC入门\r\n什么是RPC\r\n创建RPC应用程序\r\nRPC应用程序如何通信\r\n安全的RPC的最佳做法\r\n使用/robust MIDL开关\r\n使用[range]属性\r\n要求身份验证的连接\r\n使用数据包隐私和完整性\r\n使用严谨的上下文句柄\r\n不要将访问检查依赖于上下文句柄\r\n警惕NULL上下文句柄\r\n不要信任对等机\r\n使用安全回调\r\n多台RPC服务器驻留在同一进程内意味着不安全\r\n使用主流的协议\r\n安全的DCOM的最佳做法\r\nDCOM基础\r\n应用层安全\r\nDCOM用户上下文\r\n可编程的安全设置\r\n源端和接收端\r\nActiveX入门\r\n安全的ActiveX的最佳做法\r\n对于初始化和脚本来说ActiveX组件是否安全\r\n初始化和脚本安全的最佳做法\r\n本章小结\r\n\r\n第17章 防止拒绝服务攻击\r\n\r\n应用程序失败攻击\r\nCPU饥饿攻击\r\n内存不足攻击\r\n资源不足攻击\r\n网络带宽攻击\r\n本章小结\r\n\r\n第18章 编写安全的.NET代码\r\n\r\n代码访问安全概述\r\nFxCop:“必备的”工具\r\n程序集是强命名的\r\n强命名程序集和ASP.NET\r\n指定程序集权限要求\r\n请求最小的权限集\r\n拒绝不必要的权限\r\n请求可选的权限\r\n过分热衷于使用Assert方法\r\n关于Demand和Assert方法的进一步信息\r\n及时禁用断言\r\n请求和链接请求\r\nLinkDemand安全错误示例\r\n慎用SuppressUnmanagedCodeSecurityAttribute属性\r\n远程请求\r\n限制代码的使用范围\r\n不要在XML或配置文件中存放敏感数据\r\n审查允许部分信任的程序集\r\n检查非托管代码的托管包装的正确性\r\n委托的问题\r\n序列化的问题\r\n隔离存储的作用\r\n在部署ASP.NET应用程序之前禁用跟踪和调试\r\n不要远程发布冗长的错误信息\r\n反序列化来源不可信的数据\r\n失败时不要让攻击者知道太多\r\n本章小结\r\n\r\n第IV部分 特殊的安全问题\r\n\r\n第19章 安全性测试\r\n\r\n安全性测试人员的任务\r\n安全性测试各不相同\r\n根据威胁模型制订安全性测试计划\r\n分解应用程序\r\n确定组件接口\r\n按照受攻击的可能性大小排列接口\r\n确定每一个接口采用的数据结构\r\n用STAIDE威胁攻击应用程序\r\n用数据变种攻击应用程序\r\n测试之前\r\n开发查找缺陷的工具\r\n用无赖服务器测试客户机\r\n用户是否应看到或修改数据\r\n用安全模板进行测试\r\n发现一个错误时测试并未结束\r\n测试码应具有很高的质量\r\n测试端到端解决方案\r\n确定攻击面\r\n确定根攻击向量\r\n确定攻击向量的偏差\r\n统计产品中有偏差的攻击向量\r\n本章小结\r\n\r\n第20章 审查安全码\r\n\r\n处理大型应用程序\r\n多程方法\r\n从易处着手\r\n整数上溢\r\n一个相关的问题:整数下溢\r\n检查返回结果\r\n对指针代码进行额外的审查\r\n决不要相信网络上的数据\r\n本章小结\r\n\r\n第21章 安全的软件安装\r\n\r\n最小特权原则\r\n安装后立即清除密码\r\n使用安全配置编辑器\r\n低级安全API\r\n使用WindowsInstaller\r\n本章小结\r\n\r\n第22章 在应用程序中加入隐私策略\r\n\r\n对隐私的恶意侵犯和令人讨厌的侵犯\r\n主要的隐私立法\r\n个人身份信息\r\n关于数据保护的欧盟法令\r\n安全海港原则\r\n其他隐私立法\r\n隐私与安全\r\n建立隐私基础设施\r\n隐私长官的角色\r\n隐私拥护者的角色\r\n设计尊重隐私的应用程序\r\n在开发过程中加入隐私策略\r\n了解隐私的特点\r\n本章小结\r\n\r\n第23章 常见的好的做法\r\n\r\n不要向攻击者透露任何信息\r\n关于服务的最佳做法\r\n安全、服务和交互式桌面\r\n服务账户准则\r\n不要以条幅字符串的形式泄漏信息\r\n在补丁中改变错误消息时要谨慎\r\n复查错误路径\r\n保持关闭的特性不变\r\n内核模式错误\r\n高级安全问题\r\n句柄\r\n符号链接\r\n配额\r\n序列化基元\r\n缓冲区处理问题\r\nIRP取消\r\n在代码中添加关于安全的注释\r\n利用操作系统\r\n不要依赖用户去做正确的决定\r\n安全地调用CreateProcess函数\r\n不要给lpApplicationName传递NULL\r\n用引号把lpCommandLine中可执行文件的路径括起来\r\n不要创建共享的/可写入的代码段\r\n正确使用假冒函数\r\n不要把用户文件写入\ProgramFiles目录\r\n不要把用户数据写入HKLM\r\n不要以“完全控制”权限打开对象\r\n对象创建错误\r\n慎用CreateFile\r\n安全地创建临时文件\r\nSetup程序和EFS文件系统的问题\r\n文件系统再解析点问题\r\n客户瑞安全是自相矛盾的说法\r\n范例成了模板\r\n“吃掉你自己的狗食”\r\n归功于用户\r\n测定基于管理员SID的访问\r\n允许使用长的密码\r\n慎用_alloca\r\nATL转换宏\r\n不要嵌入公司的名称\r\n将字符串移至资源DLL\r\n应用程序日志\r\n从危险的C/C++迁移到托管代码\r\n\r\n第24章 编写安全文档和错误消息\r\n\r\n文档中的安全问题\r\n关于文档的基础知识\r\n通过文档缓解威胁\r\n记录安全的最佳做法\r\n错误消息中的安全问题\r\n典型的安全消息\r\n信息泄露问题\r\n被迫同意\r\n累进泄露\r\n消息要具体些\r\n最好不要提问\r\n对安全消息进行可用性测试\r\n审阅产品说明书时的注意事项\r\n安全设置的可用性\r\n本章小结\r\n\r\n第V部分 附录\r\n\r\n附录A 危险的API\r\n附录B 我们所听到的荒谬借口\r\n附录C 设计人员的安全措施和对清单\r\n附录D 开发人员的安全措施和对清单\r\n附录E 测试人员的安全措施和对清单\r\n\r\n最后的想法\r\n\r\n参考文献\r\n\r\n索引
在2002年2、3月份,Windows所有正常的安全特性都停止了工作。在此期间,整个开发组的注意力都转向如何提高此产品的下一版本即Windows.NET Server 2003的安全上。众所周知,“Windows安全运动”的目标是使开发组全体成员了解最新的安全编码技术,以找出设计和代码缺陷,改进测试代码和文档。在此运动期间,本书的第1版是Windows开发组全体成员的必读教材,而第2版收录了在这场运动中以及在针对微软其他产品的后续安全运动中的许多新发现,这些产品包括SQL Server、Office、Exchange、Systems Management Server、Visual Studio.NET、.NET公共语言运行库,等等。
Windows安全运动(以及许多其他的安全运动)的原动力,来自比尔·盖茨2002年1月15日的名为Trustworthy Computing(值得信赖的计算)的备忘录,其中概括说明了一种关于向用户提交新型计算机系统的高级策略,这种新型系统将更安全、更可靠。自从有了那个备忘录以来,我们两人已经与微软公司内外的数千名开发人员交谈过或合作过,而他们均异口同声地告诉我们同一件事情:“我们要做正确的事情——我们要开发安全的软件——但我们知道的还不够。”那种愿望和不确定性,直接道明了本书的目的:向他们传授学校里从来就学不到的技术——如何设计、生成、测试和注解安全的软件。所谓“安全的软件”,并不是指安全码或实现安全特性的代码,而是指为抵挡恶意攻击而设计的代码。安全的代码也是健壮的代码。
本书的目标是要绝对的切实可行,这反倒使您认识到您的代码可能会受到攻击。更确切地说就是如果您创建的应用程序要在一台或多台计算机上运行,而这台或这些计算机已经连接到一个网络上,或已连接到最大的网络Internet上,那么您的代码就可能会受到攻击。
系统安全受到损害后会造成各种严重后果,包括产量下降、客户信誉受损以及财产损失。例如,如果攻击者能够损害应用程序的安全(如使之无法使用),您的客户就会转用其他的产品。在使用基于Internet的服务时,大多数人都不是很有耐心。如果您的服务不可用,许多客户就会弃您而去,投奔您的竞争对手。
对于众多软件开发商来说,真正的问题是安全不像开发过程那样盈利作用显而易见。因此,管理层不愿意花钱去培训开发人员编写安全的代码,在攻击得逞之前,他们不想在安全技术上投资。而一旦攻击得逞,则为时已晚——损失已然造成。事后的修补工作,无论是在财力上还是在信誉上,都要付出高昂的代价。
历史证明,保护财产使之免遭盗窃和攻击是上策。我们的祖先早就制定了对盗窃、损坏或侵占他人财产者进行惩罚的法律。的确,人们都明白属于私人的动产和财物应当受到保护。这些道德准则也适用于数字世界,因此,作为开发人员,我们的部分职责就是创建可保护数字资产的应用程序和解决方案。
您将会注意到,本书内容中包括一些基本的问题,在学校课程里介绍“设计和构建安全的系统”这一主题时,应当讲述过这些内容。您可能会认为,设计是设计师或程序经理们的事情,但作为开发人员和测试人员,您也需要了解设计能够抵御攻击的系统结构的有关过程。
众所周知,无论您花费多少时间和精力,所开发出来的软件总是会存在一些弱点,这只是因为您无法预测未来的安全问题。我们知道,对于Windows .NET Server 2003来说,同样会存在一些弱点;但我们也知道,按照本书中所建议的方法,可以减少弱点的总数,大大增加发现和利用代码中弱点的难度。
本书读者对象
在设计应用程序,或生成、测试以及注释解决方案时,您需要本书。如果您的应用程序是基于Web的或基于Win32的,您也需要本书。如果您正在学习或开发基于Microsoft.NET框架的应用程序,您还需要本书。总之,如果您的工作涉及到应用程序开发,您会在本书中找到许多值得学习的内容。
即使您正在编写不在Microsoft平台上运行的代码,本书中的许多内容依然非常有用。除了个别几章是完全针对Microsoft平台以外,同一类型的问题日渐与平台无关。即便有时某种东西似乎仅适用于Windows,但其通常有更加广泛的应用。例如,Everyone用户的“完全控制”访问控制列表和UNIX系统上设置给World Writ able的文件,其实是同一问题,而跨网站的脚本问题是普遍存在的。
本书组织结构
本书分为五个部分。第1部分(第1~4章), “当前的安全问题”,概括说明了为什么要保护系统安全使之免遭攻击,以及设计这种系统的原则和分析技术。
本书的主要内容集中在第II部分和第III部分。第II部分,“安全的编码技术”,包括第5~14章,概括介绍了几乎适用于任何一种应用程序的重要的编码技术。第IIII部分,“更安全的编码技术”,包括4章(第15—18章),重点介绍了网络应用程序和.NET代码。
第IV部分,“特殊的安全问题”,包括6章(第19~24章),讲述了一般的图书中很少讨论的主题,如测试、进行安全代码审查、隐私策略以及安全的软件安装等问题。第23章介绍了放在其他各章都不太合适的一些一般原则。
第V部分,“附录”,包括5个附录,分别介绍危险的API、我们所听到的未考虑安全问题的一些荒谬的借口以及分别针对设计人员、开发人员和测试人员设计的安全措施核对清单。
与其他关于安全的图书的作者不同,我们不仅告诉您应用程序怎么会不安全,而且告诉您为什么攻击,人们常犯的错误,以及最重要的、如何构建安全的系统。(顺便说一句,请注意页边的图标它们表示与安全有关的奇闻轶事。)
安装和使用范例文件
通过连接到站点http://www.microsoft.com/mspress/books/5957.asp,可以从Web上下载本书的Companion Content页下载范例文件。要访问范例文件,请单击该页右侧More information菜单框中的Companion Content链接,打开Companion Content页,此页中包括下载范例文件的链接,也可以连接到Microsoft Press Support站点。下载链接可打开一个包含有许可协议的可执行文件。要想把范例文件复制到硬盘上,请单击运行可执行文件的链接,然后接受显示的许可协议。默认情况下,范例文件将被复制到[我的文档]\Microsoft Ptess\Securec02文件夹下。在安装过程中,可以改变目标文件。
系统要求
尽管可以使用包括Visual C++ 6.0在内的大多数编译器来编译本书中用C/C++编写的大多数范例,但还是要求您安装Microsoft Visual Studio .NET。用Perl编写的范例已经使用ActiveState Perl 5.6或ActivateState Visual Perl 1.0(可从http://www.activestate.com下载)测试过。VBScript和JScript代码已经用Windows Script Host测试过,Windows 2000及其以后的版本中包含Windows Script Host所有SQL范例都使用SQL Server 2000进行了测试。而Visual Bask.NET和Visual C#应用程序均是使用Visual Studio.NET编写和测试的。
本书中的所有应用程序(两个例外),均可以在符合建议的操作系统要求的、运行windows 2000的计算机上运行。第7章的safer范例和第11章的UTF8 MultiByteTowideChar范例,必须在windows XP或windows .NET server上才能正确运行。编译代码时必须使用比符合编译器要求的机器更加健壮的机器。
支持信息
为了降低书的成本,减轻读者负担,对于因内容很少而不值得单独配盘的图书,我们将其范例代码或练习文件放在我们的网站上,供读者下载。敬请访问以下网址:http://www.wenyuan.com.cn,查找本书的有关链接。如果您对本书或配书文件有任何建议、意见或想法,请通过以下电子邮件与清华大学出版社计算机应用编辑二室客户服务部取得联系:Service@wenyuan.com.cn