具体描述
软件安全是一个不断变化的主题,不仅不断出现新的漏洞类型,而且出现了漏洞的各种变体.本书总结了目前最危险的24个安全漏洞,给出了丰富的漏洞示例,并且提供了相应的修复措施。
● 各种Web应用程序漏洞及修复措施
● 各种实现漏洞及修复措施
● 各种加密漏洞及修复措施
● 各种联网漏洞及修复措施
作者简介
Michael Howard是Microsoft公司Trustworthy Computing(TwC)Group(可信赖计算组)下属安全工程组的高级安全项目经理,负责管理整个公司的安全设计、编程和测试技术。Howard是一位Security Development Lifecycle(SDL)构建师,SDL是一个提高微软软件安全性的过程。
Howard于1992年开始在微软公司工作,那时他在微软公司的新西兰分部,刚开始的前两年在产品支持服务小组为Windows籼编译器提供技术支持,接着为Microsoft ConsultingServices提供技术支持,在此阶段,他为客户提供安全基础架构支持,并帮助设计定制的解决方案利软件开发。1997年,Howard调到美国,为微软的Web服务程序Internet Information Services的Windows分部工作,2000年开始担任目前的下作。
Howard是IEEE Security&Privacy一书的编辑,经常在与安全相关的会议上:发言,定期发表安全编码和设计方面的文章。Howard与他人一起编写了6本安全图书,包括获奖书籍Writing Secure Code(第二版,Microsoft Press,2003年)、19 Deadly Sins of Software Security(McGraw-Hill Professional出版社,2005年)、The Security Development Lifecycle(Microsoft Press,2006年),最近出版的图书Writing Secure Code for Windows Vista(Microsoft Press,2007年)。
David LeBlanc博士目前是Microsoft Office Trustworthy Computing工作组的一位主要软件开发工程师,负责设计和实现Microsoft Office中的安全技术。他还给其他开发人员提供安全编程技术方面的建议。自从1999年加入微软公司以来,他一直负责操作网络安全,还是可信赖主动计算(Trustworthy computing Initiative)的创始人之一。
David与他人合著了获奖书籍Writing Secure Code(第二版,Microsoft Press,2003年)、19 Deadly Sins of Software Security(McGraw-Hill Professional出版社,2005年)、Writing SecureCode[orWindowsVista(MicrosoftPress,2007年),还发表了许多文章。
John Viega是McAfee的SaaS Business Unit的CTO,是19 deadly programming flaws一书的作者,这本书引起了出版社和媒体的极大关注。本书就是以该书为基础的。他和其他人共同编写了许多其他关于软件安全的图书,包括Building Secure Software(Addison-Wesley Press,2001年),Network Security with OpenSSL(O'Reilly Press,2002年),以及Myths of Security(O'Reilly Press,2009年)。他负责许多软件安全工具,是Mailman(GNU邮件列表管理器)的第一作者,他为IEEE和IETF中的标准化做了大量的工作,还与他人一起开发了GCM(NIST已标准化的一种加密算法)。John还是几家安全公司的安全顾问,包括Fortify和Bit9公司。他拥有Virginia大学的硕士和学士学位。
目录信息
第1章 SQL注入
1.1 漏洞概述
1.2 CWE参考
1.3 受影响的编程语言
1.4 漏洞详述
1.4.1 关于LINQ的注意事项
1.4.2 受漏洞影响的C#
1.4.3 受漏洞影响的PHP
1.4.4 受漏洞影响的Perl/CGI
1.4.5 受漏洞影响的Python
1.4.6 受漏洞影响的Ruby on Rails
1.4.7 受漏洞影响的Java和JDBC
1.4.8 受漏洞影响的C/C++
1.4.9 受漏洞影响的SQL
1.4.10 相关漏洞
1.5 查找漏洞模式
1.6 在代码审查期间查找该漏洞
1.7 发现该漏洞的测试技巧
1.8 漏洞示例
1.8.1 CVE-2006.4953
1.8.2 CVE-2006.4592
1.9 弥补措施
1.9.1 验证所有的输入
1.9.2 使用prepared语句构造SQL语句
1.9.3 C#弥补措施
1.9.4 PHP5.0以及MySQL1.1或者以后版本的弥补措施
1.9.5 Perl/CGI弥补措施
1.9.6 Python弥补措施
1.9.7 Ruby on Rails弥补措施
1.9.8 使用JDBC的Java弥补措施
1.9.9 ColdFusion弥补措施
1.9.10 SQL弥补措施
1.10 其他防御措施
1.10.1 加密敏感数据、PII数据或机密数据
1.10.2 使用URL Scan
1.11 其他资源
1.12 本章小结
第2章 与Web服务器相关的漏洞(XSS、XSRF和响应拆分)
2.1 漏洞概述
2.2 CWE参考
2.3 受影响的编程语言
2.4 漏洞详述
2.4.1 基于DOM的XSS或类型
2.4.2 反射XSS,非持续XSS或类型
……
第3章 与Web客户端相关的漏洞(XSS)
第4章 使用Magic URL、可预计的cookie及隐藏表单字段
第Ⅱ部分 实现漏洞
第5章 缓冲区溢出
第6章 格式化字符串的问题
第7章 整数溢出
第8章 C++灾难
第9章 捕获异常
第10章 命令注入
第11章 未能正确处理错误
第12章 信息泄漏
第13章 竞态条件
第14章 不良可用性
第15章 不易更新
第16章 执行代码的权限过大
第17章 未能完全地存储数据
第18章 移动代码的漏洞
第Ⅲ部分 加密漏洞
第19章 使用基于弱密码的系统
第20章 弱随机数
第21章 使用错误的密码技术
第Ⅳ部分 隧网漏洞
第22章 未能保护好网络通信
第23章 未能正确使用PKI,尤其是SSL
第24章 轻信网络域名解析
· · · · · · (收起)
读后感
用户评价
阅读这本书的过程,与其说是学习,不如说是进行了一次深入的“反思之旅”。作者似乎对当下主流安全工具的有效性持保留态度,他花了相当大的篇幅去论证自动化扫描工具的局限性,指出它们在识别复杂业务逻辑漏洞和状态依赖型缺陷时的无能为力。他反复强调,安全最终的防线,永远是人的思维,是架构师和工程师对系统边界的清晰认知。这种对“人机协同”中“人”的环节的极度重视,让这本书区别于市面上大部分侧重工具和流程的著作。书中的案例很多都指向了那些“人类的疏忽”——比如错误的注释、被遗忘的调试代码、以及多年前为了赶进度而采取的“技术债”——这些才是真正造成大规模安全事件的温床。对我而言,这本书最大的价值在于,它帮助我重新校准了对“安全投入回报率”的看法。它教会我,与其花费巨资购买最新的WAF或RASP产品,不如先确保核心业务逻辑的契约被严格遵守,确保基础的认证和授权机制没有被轻易绕过。这是一种自底向上、回归本源的安全哲学,非常值得所有关注软件质量的专业人士深思。
这本书的语言风格极其朴实,几乎可以说是直白得有些生硬,完全没有那种故作高深的学术腔调。它更像是请了一位身经百战的老程序员,坐在你旁边,一边敲着键盘,一边把这些年踩过的坑、遇到的离奇Bug,以及那些让人拍案叫绝的“邪门歪道”和盘托出。比如,书中对输入验证环节的描述,没有冗长的理论铺陈,而是直接展示了好几个不同语言环境下,开发者如何因为一个不经意的类型转换或者边界条件处理失误,导致整个系统瞬间失守的真实案例。读起来的感觉,就像是看一份详尽的事故复盘报告,每一页都写满了“血泪教训”。我尤其喜欢其中关于权限控制的那一章,作者没有满足于讲解标准的RBAC模型,反而花了大量篇幅去剖析那些在遗留系统升级、微服务拆分过程中,权限体系是如何悄无声息地腐化、产生难以追踪的逻辑漏洞,那种对细节的偏执和对现实工程困境的深刻洞察,让人不得不佩服。它不是那种教你如何写出完美无瑕代码的圣经,而是更贴近工程实践的“防守手册”,让你知道在真实、混乱、多变的环境中,安全到底有多脆弱,以及我们该如何用最务实的方式去修补那些永远修不完的漏洞。
如果要用一个词来概括这本书给我的感受,那就是“冷峻的实用主义”。作者似乎完全摒弃了对“完美安全”的浪漫幻想,而是直截了当地告诉你,在资源有限、时间紧迫的开发周期内,哪些安全投入的边际效益最高,哪些地方是必须死守的“底线”。书中大量引用了各种开源项目的CVE分析和补丁代码,并且常常附带一句极其精辟的评论,比如:“这个修复只是把地毯下的灰尘扫到了另一个角落,而不是清除了灰尘本身。”这种毫不留 আবরণ的批判性,甚至带有一丝悲观主义色彩的论调,使得阅读体验非常独特。它不像那些鼓吹“零信任架构”或“DevSecOps”的文章那样充满希望,反而更像是一剂清醒剂,让你明白安全防护永远是一个动态的、永无止境的“打地鼠”游戏。我尤其欣赏作者对“安全教育”这部分内容的描述,他没有提倡枯燥的培训,而是强调通过构建一个鼓励“试探”和“报告”的工程文化,让安全内化为开发者的本能反应,这在很多企业中都是难以实现的“政治正确”难题,但作者却将其作为实现有效防御的关键。
这本书的结构安排,说实话,初看起来有些跳跃,不像传统教科书那样层层递进,从基础定义到高级应用有清晰的脉络。它更像是从一个安全审计师的视角出发,漫无目的地在代码库和系统架构图之间游走,随手指出那些最致命的“阿喀琉斯之踵”。比如,它会突然从一个网络协议栈的漏洞讲到前端JavaScript框架中的原型链污染,两者之间似乎没有明确的逻辑过渡,但当你仔细揣摩时,会发现作者是通过某种隐含的“信任链断裂”这一核心思想串联起来的。这种非线性的叙事方式,初次阅读时可能会让人感到些许迷茫,需要读者自己去构建知识间的联系。然而,一旦适应了这种“实战导向”的叙事节奏,你会发现它的效率极高。它没有浪费时间在那些已经被嚼烂的经典漏洞介绍上,而是迅速切入到那些容易被主流安全指南忽略的“灰色地带”,比如配置漂移、供应链依赖的隐蔽后门,以及在容器化部署下新的攻击面。这本书的价值不在于系统的知识体系构建,而在于它为你提供了一套“破坏性思维”,迫使你从最不可能出错的地方去寻找安全隐患。
这本书在技术细节的深度挖掘上,达到了令人咋舌的程度,但这种深度并非停留在学术论文那种理论推导上,而是直接深入到运行时环境的底层机制。例如,在讲解内存安全问题时,作者没有止步于缓冲区溢出,而是详细拆解了现代编译器如何引入各种优化(如逃逸分析、内联),这些优化在提升性能的同时,如何在无意中为攻击者开启了新的利用路径,以及如何通过特定的编译选项来反制这些行为。这种深入到工具链层面的探讨,使得这本书的受众群体明显偏向于资深的系统工程师和底层的安全研究人员。对于初学者而言,可能需要极大的耐心去消化其中的汇编代码片段和特定的操作系统调用细节。但正是这种“刨根问底”的精神,让这本书的结论具有极强的说服力。它不是在告诉你“不要用C语言写网络服务”,而是在告诉你“如果你必须用C语言,那么请务必了解编译器是如何误导你的”。这种深度的剖析,极大地提升了对软件运行原理的认知,安全问题不再是抽象的漏洞名称,而是具体的内存布局和CPU指令序列的错误组合。
很早之前读的,早就不碰安全了
很早之前读的,早就不碰安全了
简单的列举了一些攻击 情况,当资料查阅的
简单的列举了一些攻击 情况,当资料查阅的
很早之前读的,早就不碰安全了