Java编码指南:编写安全可靠程序的75条建议.pdf 作者-[美]Fred Long Dhruv Mohindra Robert C.Seacord Dean 120页
内容简介:
本书是《Java安全编码标准》一书的扩展,书中把那些不必列入Java安全编码标准但是同样会导致系统不可靠或不安全的Java编码实践整理了出来,并为这些糟糕的实践提供了相应的文档和警告,以及合规解决方案。读者可以将本书作为Java安全方面的工具书,根据自己的需要,找到自己感兴趣的规则进行阅读和理解,或者在实际开发中遇到安全问题时,根据书中列出的大致分类对规则进行索引和阅读,也可以通读全书的所有规则,系统地了解Java安全规则,增强对Java安全特性、语言使用、运行环境特性
目录菜单:
封面,扉页,版权,版权声明,译者简介,序,前言,致谢,作者介绍,第1章 安全,指南1:限制敏感数据的生命周期,指南2:不要在客户端存储未经加密的敏感数据,指南3:为敏感可变类提供不可修改的包装器,指南4:确保安全敏感方法被调用时参数经过验证,指南5:防止任意文件上传,指南6:准确地编码或转义输出,指南7:防止代码注入,指南8:防止XPath注入,指南9:防止LDAP注入,指南10:不要使用clone()方法来复制不可信的方法参数,指南11:不要使用Object.equals()来比较密钥,指南12:不要使用不安全的弱加密算法,指南13:使用散列函数存储密码,指南14:确保SecureRandom准确地选择随机数种子,指南15:不要依赖可以被不可信代码覆盖的方法,指南16:避免授予过多特权,指南17:最小化特权代码,指南18:不要将使用降低安全性检查的方法暴露给不可信代码,指南19:对细粒度的安全定义自定义安全权限,指南20:使用安全管理器创建一个安全的沙盒,指南21:不要让不可信代码误用回调方法的特权,第2章 防备式编程,指南22:最小化变量的作用域,指南23:最小化@SuppressWarnings注解的作用域,指南24:最小化类及其成员的可访问性,指南25:文档化代码的线程安全性,指南26:为方法的结果值提供反馈,指南27:使用多个文件属性识别文件,指南28:不要赋予枚举常量的序号任何特别意义,指南29:注意数字提升行为,指南30:对可变参数的类型做编译时类型检查,指南31:不要把其值在以后版本里可能会发生变化的常量设置为public final,指南32:避免包之间的循环依赖,指南33:使用用户自定义的异常而非宽泛的异常类型,指南34:尽量从系统错误中优雅恢复,指南35:发布接口前请谨慎设计,指南36:编写对垃圾收集机制友好的代码,第3章 可靠性,指南37:不要在子作用域里遮蔽或者掩盖标识符,指南38:不要在一个声明里声明多个变量,指南39:在程序逻辑中用有意义的符号常量代表文字值,指南40:在常量定义中恰当地表示相互之间的关系,指南41:对于返回数组或者集合的方法,用返回一个空数组或者集合来替代返回一个空值,指南42:只在异常的情况下使用异常,指南43:使用try-with-resources语句安全处理可关闭的资源,指南44:不要使用断言来验证不存在的运行时错误,指南45:在条件表达式中,第二个和第三个操作数应使用相同类型,指南46:不要序列化直接指向系统资源的句柄,指南47:更倾向于使用迭代器而不是列举,指南48:对于短生存周期、不常用的对象不要使用直接缓冲区,指南49:从长生存周期容器对象中移除短生存周期对象,第4章 程序的可理解性,指南50:谨慎使用视觉上有误导性的标识符和文字,指南51:避免歧义重载变参方法,指南52:要避免使用带内错误指示器,指南53:不要在条件表达式中进行赋值,指南54:请使用大括号把if、for或while代码体括起来,指南55:不要直接在if、for或while条件语句后面加分号,指南56:在每一个case分支的代码块中加上break语句,指南57:避免不当的计算循环计数器,指南58:使用括号表示操作的优先级,指南59:不要对文件的创建做任何假设,指南60:做浮点运算前把整数转换为浮点数,指南61:确保对象的clone()方法中有调用super.clone(),指南62:保持注释的一致性和可读性,指南63:检测并移除冗余的代码和值,指南64:尽量保证逻辑完备,指南65:避免有歧义的重载或者误导性的重载,第5章 程序员的常见误解,指南66:不要假设使用volatile关键字声明引用可以保证引用所指对象的安全发布,指南67:不要假设sleep()、yield()或getState()方法提供了同步语义,指南68:不要假设对整数做取余运算总是返回正整数,指南69:不要弄混抽象对象的相等性和引用的相等性,指南70:理解按位运算符和逻辑运算符之间的差异,指南71:理解加载字符串时如何做特别字符转义,指南72:不要使用重载的方法来区分运行时类型,指南73:不要弄混引用的不可变性和对象的不可变性,指南74:谨慎使用序列化方法 writeUnshared()和readUnshared(),指南75:不要试图通过把本地引用变量设置为null来帮助垃圾收集器,附录 Android,术语表,参考文献
文本摘要:
PEARSONJAVA?CODING GUIDELINES 75 RECOMMENDATIONS FOR RELIABLE AND SECURE PROGRAMSJava编码指南:编写安全可靠程序的75条建议〔美〕Fred Long Dhruv Mohindra Robert C.Seacord Dean F.Sutherland David Svoboda 著刘先宁 尤青松 译人民邮电出版社北京图书在版编目(CIP)数据Java编码指南:编写安全可靠程序的75条建议/(美)朗(Long,F.)等著;刘先宁,尤青松译.--北京:人民邮电出版社,2015.12书名原文:Java Goding Guidelines:75 Recommendations for Reliable and Secure ProgramsISBN 978-7-115-40371-1Ⅰ.①J… Ⅱ.①朗…②刘…③尤… Ⅲ.①JAVA语言—程序设计—指南 Ⅳ.①TP312-62中国版本图书馆CIP数据核字(2015)第242307号内容提要本书是《Java安全编码标准》一书的扩展,书中把那些不必列入Java安全编码标准但是同样会导致系统不可靠或不安全的Java编码实践整理了出来,并为这些糟糕的实践提供了相应的文档和警告,以及合规解决方案。读者可以将本书作为Java安全方面的工具书,根据自己的需要,找到自己感兴趣的规则进行阅读和理解,或者在实际开发中遇到安全问题时,根据书中列出的大致分类对规则进行索引和阅读,也可以通读全书的所有规则,系统地了解Java安全规则,增强对Java安全特性、语言使用、运行环境特性的理解。本书给出了帮助Java软件工程师设计出高质量的、安全的、可靠的、强盛的、有弹性的、可用性和可维护性高的软件系统的75条编码指南,适合所有Java开发人员阅读,也适合高等院校教师和学生学习和参考。◆著 [美]Fred Long Dhruv Mohindra Robert C.Seacord Dean F.Sutherland David Svoboda译 刘先宁 尤青松责任编辑 杨海玲责任印制 张佳莹 焦志炜◆人民邮电出版社出版发行 北京市丰台区成寿寺路11号邮编 100164 电子邮件 315@ptpress.com.cn网址 http://www.ptpress.com.cn固安县铭成印刷有限公司印刷◆开本:720×960 1/16印张:17.75字数:328千字 2015年12月第1版印数:1-3000册 2015年12月河北第1次印刷著作权合同登记号 图字:01-2013-9195号定价:55.00元读者服务热线:(010)81055410 印装质量热线:(010)81055316反盗版热线:(010)81055315版权声明Authorized translation from the English language edition,entitled Java Coding Guidelines:75 Recommendations for Reliable and Secure Programs,9780321933157 by Fred Long,Dhruv Mohindra,Robert C.Seacord,Dean F.Sutherland,and David Svoboda,published by Pearson Education,Inc.,publishing as Addison-Wesley,Copyright ? 2014 by Pearson Education,Inc.All rights reserved.No part of this book may be reproduced or transmitted in any form or by any means,electronic or mechanical,including photocopying,recording or by any information storage retrieval system,without permission from Pearson Education,Inc.CHINESE SIMPLIFIED language edition published by PEARSON EDUCATION ASIA LTD.and POSTS & TELECOM PRESS Copyright ? 2015.本书中文简体字版由Pearson Education Asia Ltd.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。本书封面贴有Pearson Education(培生教育出版集团)激光防伪标签,无标签者不得销售。版权所有,侵权必究。译者简介刘先宁 ThoughtWorks高级咨询师,长期从事一线软件开发工作,对Java、面向对象、敏捷方法论都有较深理解。其译作还包括《HTML5移动Web开发实践》。尤青松 ThoughtWorks咨询师,在敏捷软件交付团队中担任技术领导人,尤其对Java企业软件开发及其安全编程有较深理解。作为《The CERTOracleSecure Coding Standard for Java?》的一个延伸,本书是非常有价值的,它甚至可以命名为《可靠的 Java 编码指南》(Reliable Java? Coding Guidelines)。这些年来,可靠性和安全性之间的相互影响深深地触动了我。现如今,虽然有各种各样的显式的安全手段(如加密、身份验证等)用以确保系统安全,但是大多数的漏洞都来自于开发中的失误:编码太差或防备不足。当我们说要构建一个可靠的系统时,在很大程度上等同于构建一个安全的系统。系统的安全性将会得益于你对系统可靠性所做的一切,反之亦然。本书强调了这样一个事实:所谓的安全性其实不是一个特性,而是一种针对所有的潜在的不安全因素都予以充分考虑的态度。安全性应该被持续贯穿在每一位软件工程师的设计思索过程中。它的基础是一系列的编码指南。本书最精彩的地方就是这些编码指南背后的微妙之处。例如,“用散列函数存储密码”,这看上去是一件很基础很明显的事情,然而常常有新闻报道说,由于程序员没有考虑到密码的加密而导致重要数据泄露。大量的细节之处成为了安全隐患的藏身之所,这让系统安全变得很棘手。本书充满了处理这些细节的精彩指导。——“Java之父”James A.Gosling前言本书为Java程序员提供了详细的建议。这些Java编码指南的应用将会带来更健壮、更能抵御攻击的系统。这些编码指南覆盖范围广泛,适用于大多数基于Java编写的运行在不同设备上的产品,这些设备包括电脑、游戏机、手机、平板电脑、家用电器和汽车电子设备。不管是哪一门编程语言,开发人员在控制程序结构时都应遵守一系列基于该语言特定规则的指南。Java程序员也理应如此。为了编写安全可靠的Java程序,Java程序员需要很多的帮助,单凭Java语言规范(Java Language Specification,JLS)[JLS 2013]是远远不够的。由于Java包含的许多语言特性和API很容易被误用,因此需要一些必要的避免这些陷阱的指导。对于一个程序来说,可靠意味着在所有场景或所有可能输入条件下均能正常工作。不可避免的是,任何重要的程序都会遇到一些完全意想不到的输入或场景,从而发生错误。当此类错误发生时,最重要的是它产生的影响必须是有限的,而这可以通过快速定位错误并尽快处理它来实现。预期不寻常的输入或编程场景,并采用防备式编程方式,程序员会受益良多。其中一些指南可能被认为是一种编码风格,但对于代码的可读性和可维护性来说,它们仍旧很重要。针对Java语言,Oracle公司提供了一组编码约定[Conventions 2009]来帮助程序员编写具有一致编程风格的代码,这些约定已经被Java程序员广泛采用。《The CERTOracleSecure Coding Standard for Java?》本书由《The CERTOracleSecure Coding Standard for Java?》[Long 2012]一书的作者编写。该编码标准提供了一组针对Java语言的安全编码规则,目的是消除那些可能导致安全隐患的不安全编码实践。该安全编码标准为软件系统建立了规范的需求,同时也可以用来评估软件系统的一致性,例如,使用《Source Code Analysis Laboratory (SCALe)》[Seacord 2012]来检测软件系统的一致性。不过,有些不必列入Java安全编码标准的、糟糕的Java编码实践,也会导致不可靠或不安全的程序。本书针对这样的编码实践提供了相应的文档和警告。虽然这些编码指南没有出现在《The CERTOracleSecure Coding Standard for Java?》[Long 2012]中,但是它们的重要性却不应该被忽视。当一个编码指南不能构成一个规范需求时,是不能被收录到编码标准里的。无法构成规范需求的原因有很多,可能最常见的原因是,规则取决于程序员的意图。这些规则不能自动应用,除非程序员有特定的意图,在这种情况下,代码和特定的意图是需要保持一致的。为了形成一个规范的需求,需要证明的是,倘若不遵守这一需求将会导致代码缺陷。有些编码指南已经被排除在编码标准之外(但包括在本书当中),遵守这些指南进行编码始终是一个好主意,但违背这些指南也并不总是会导致错误的结果。之所以会有这样的区别,是因为倘若该系统没有因此产生特定的缺陷,我们不能说它不合格。因此,编码规则必须有非常严格的定义。而编码指南往往会对安全性和可靠性产生更深远的影响,因为它们可以被更概括地定义。许多指南都参考了《The CERTOracleSecure Coding Standard for Java?》里面的规则。这些引用的形式类似于“IDS01-J. Normalize strings before validating them”,引号中的前三个字母表示的是《The CERTOracleSecure Coding Standard for Java?》一书的相关章节。例如,IDS指的是第2章“Input Validation and Data Sanitization (IDS)”。这些安全编码标准针对Java的详细规则也可在CERT的安全编码百科网站(www.securecoding.cert.org)上找到,在那里它们有持续的更新。《The CERTOracle Secure Coding Standard for Java?》提供了针对一致性测试的定义,但安全编码百科上可能有该书没有涉及的、关于这些定义的扩展信息以及见解,这些可以帮助程序员理解这些规则的意义。本书中对于其他编码指南的交叉引用都只给出了编码指南的编号。范围本书侧重于Java SE 7平台环境,同时针对在安全编码过程中由于使用Java SE 7 API而产生的问题,进行了一些指导。Java语言规范Java SE 7版(The Java Language Specification: Java SE 7 Edition,JLS)[JLS 2013]规定了Java编程语言的行为,本书的这些指南主要是参考它开发出来的。传统编程语言,如C和C++,它们的语言标准里包括了一些未定义的、未指明的以及实现定义的(implementation-defined)行为,这些都容易使程序员对这些行为的可移植性作出不准确的假设,从而导致漏洞。相比之下,Java语言规范更严格地定义了语言行为,因为Java是一种跨平台语言。即便如此,某些行为的自由裁量权还是留给了Java虚拟机(Java Virtual Machine,JVM)的实现者或者Java编译器。这些指南确定出了这种语言的特点,提供了一些可以帮助开发者定位问题的解决方案,让程序员领会和理解语言的局限性并更好地利用它。只关注语言本身并不能编写出可靠安全的软件。有时,Java API中设计有问题的接口会被弃用。其他时候,API或相关文档也有可能被编程社区不准确地解读。这些指南识别出了有可能被曲解的API,并强调了它们的准确用法,常用的、有缺陷的设计模式和编程风格的示例也包括在内。Java语言、其核心API和扩展API以及Java虚拟机提供了一些安全特性,如安全管理器、访问控制器、加密解密、自动内存管理、强类型检查和字节码验证。这些特性可以为大多数应用程序提供足够的安全,但它们的准确使用却是至关重要的。这些指南不仅强调了那些与安全体系结构相关的陷阱和警告,同时强调了它的准确实现。遵守这些指南可以确保被信任程序不出现大量的可利用的安全漏洞,从而避免可能导致的拒绝服务、信息泄露、错误的计算和特权升级。包含的库图P-1是Oracle公司Java SE产品的概念图。图P-1 Oracle公司Java SE产品的概念图(来自Oracle公司的Java SE Documentation, http://docs.oracle.com/javase/7/docs/.Copyright ? 1995,2010,Oracle and/or its affiliates.All rights reserved.)这些编码指南主要适用于基于lang和util的库以及“其他基础库”,解决了其中的安全问题。这些编码指南没有包含那些已经标记为需要修复的公开bug或者那些没有负面影响的问题。某些功能性bug也被包含其中,它们发生频率高,可造成相称大的安全或可靠性问题,或者影响大多数依赖于核心平台的Java技术。这些指南不仅包括特定于核心API的安全问题,还包括重要的有关标准扩展API(javax包)的可靠性和安全性问题。为了掌握Java提供的全方位的安全特性,程序员需要学习通过代码与其他组件和框架进行交互。偶尔,本书中的编码指南使用的示例来自于流行的Web应用程序框架(如Spring和Struts)和流行的技术,如Java服务器页面(Java Server Page,JSP),通过这些示例突出安全漏洞并不是单独存在的。只有当标准API本身没有提供选项来避免漏洞时,第三方库和解决方案才应予以考虑。没有解决的问题这个安全编码标准没有解决的若干问题。内容本书中采用的这些编码指南是广泛适用于几乎所有平台的,那些关注点在单一Java平台上的编码指南(例如,那些Android、Java微小版(ME)或Java企业版(EE)适用但Java标准版(SE)不适用的编码指南)被排除在了本书之外。另外,在Java标准版中,用于处理用户界面(用户界面工具包)或为 Web 界面提供特性(如声音、图像渲染、用户账户访问控制、会话管理、身份验证以及授权)的API,也超出了本指南的范围。尽管如此,书中的这些指南还是讨论了网络化的 Java 系统因不适当的输入验证而带来的相关风险,以及面临的注入式缺陷,并提供了适当的解决方案。另外,书中这些指南已假定产品的功能规范已被准确识别,同时没有来自高层设计和架构的缺陷。编码风格编码风格问题是主观性的,已被证明的是——在编码风格方面是不可能达成共识的。因此,本书通常尽量避免采用任何特定的编码风格。相反,我们建议用户通过这些指南定义自己的编码风格。让编码风格持续一致的最简朴方法就是使用代码格式化工具。许多集成开发环境(IDE)都提供了这样的功能。工具这些指南并不能够自动检测或修正。在某些情况下,工具厂商可以选择实现检查器来确定代码是否违背了这些指南。软件工程研究所(Software Engineering Institute, SEI)作为美国联邦政府资助的研发中央(Federally Funded Research and Development Center,FFRDC),不适合为此推荐特定的供应商或工具。有争议的指南通常,本书会尽量避免包含具有争议的、缺乏广泛共识的指南。目标读者本书主要适用于Java语言程序开发人员。虽然这些指南的重点放在了Java SE 7平台环境上,但对于工作在Java ME、Java EE或其他Java版本平台环境上的程序员们,也具有一定的参考价值(虽然不完全)。尽管这些指南的主要设计目的是构建安全可靠的系统,但这些指南同时也有助于提高系统的其他质量属性,如安全性、可靠性、健壮性、可用性和可维护性。这些指南还适合于:分析工具的开发者,用于诊断出不安全或不合规范的Java语言程序;软件开发经理、软件购买者或其他软件开发专家,用于建立一套严格的安全编码标准;Java编码课程的教育工作者,可作为主教材或辅助教材。内容组织本书的75条编码指南是围绕着以下原则组织的。第1章“安全”介绍了用于确保Java应用程序安全性的编码指南。第2章“防备式编程”包含一些防备式编码指南,通过这些指南,程序员可以编写出防备性的程序。第3章“可靠性”给出了提高Java应用程序可靠性和安全性的建议。第4章“程序的可理解性”给出了让程序更易读易懂的建议。第5章“程序员的常见误解”展示一些Java语言和编程概念常常被误解的情形。附录A描述了本书针对在Android平台上进行Java编程的适用性。本书还包含了常用术语表和参考文献。本书中的指南均有一致的结构。标题和起始段落定义了该指南的本质。紧接着通常是由一个或多个违规代码示例及其相应的合规解决方案。每个指南的最后一个部分均给出了该指南的适用性和详细参考文献。致谢本书得以完成离不开广大社区人员的帮助,首先,要感谢为本书编码指南做过贡献的Ron Bandes、Jose Sandoval Chaverri、Ryan Hall、Fei He、Ryan Hofler、Sam Kaplan、Michael Kross、Christopher Leonavicius、Bocong Liu、Bastian Marquis、Aniket Mokashi、Jonathan、Paulson、Michael Rosenman、Tamir Sen、John Truelove和Matthew Wiethoff。其次,非常感谢为本书的内容提供过帮助的James Ahlborn、Neelkamal Gaharwar、Ankur Goyal、Tim Halloran、Sujay Jain、Pranjal Jumde、Justin Loo、Yitzhak Mandelbaum、Todd Nowacki、Vishal Patel、Justin Pincar、Abhishek Ramani、Brendon Saulsbury、Kirk Sayre、Glenn Stroz、Yozo Toda和Shishir Kumar Yadav。另外,还需要感谢Hiroshi Kumagai和JPCERT对本书的Android附录所做的贡献。感谢本书的审视人员:Thomas Hawtin、Dan Plakosh和Steve Scholnick。感谢SEI和CERT的管理者支持和鼓励我们完成本书,他们是Archie Andrews、Rich Pethia、Greg Shannon和Bill Wilson。感谢本书的编辑Peter Gordon以及他在 Addison-Wesley出版社的团队:Kim Boedigheimer、Jennifer Bortel、John Fuller、Stephane Nakib和Julie Nahil;同样感谢项目编辑Anna Popick和文字编辑Melinda Rankin。感谢CERT团队的其他成员的支持和帮助,没有你们的帮助,本书不可能完成。最后,同样要感谢本书的责任编辑Carol J. Lallier,是她让这本书变成可能。作者介绍Fred Long是英国Aberystwyth大学计算机科学系的高级讲师,主要讲授:形式方法论,Java、C++和 C 语言编程,以及编程相关的安全问题。他还是英国计算机协会中威尔士分会的主席。Fred自1992年起一直担任软件工程研究所(Software Engineering Institute)的客座科学家。最近他的研究内容涉及了Java中的漏洞调查。Fred还是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。Dhruv Mohindra是印度Persistent Systems有限公司CTO办公室下的安全实践小组的技术领导。他为各个领域的公司提供信息安全方面的咨询服务,包括云服务、协作、银行、金融业、电信行业、企业、移动、生命科学和卫生保健领域。他会定期为财富500强、中小企业和创业公司的高级经理和开发团队提供咨询服务,帮助他们在软件开发周期中构建安全,实施最佳信息安全实践。Dhruv曾在软件工程研究院的CERT分部工作,持续推动编程社区的安全意识提升。Dhruv拥有印度Pune大学的本科学位,以及卡内基-梅隆大学的信息安全策略与管理硕士学位。Dhruv同样也是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。Robert C. Seacord是一位安全编码技术经理,就职于宾夕法尼亚州匹兹堡市的卡内基-梅隆软件工程研究院(Software Engineering Institute,SEI)的CERT分部。他还是卡内基-梅隆大学计算机科学与信息网络学院的教授,是《The CERTC Secure Coding Standard》一书的作者,以及下列书籍的合著者:《Building Systems from Commercial Components》《Modernizing Legacy Systems》《The CERTOracleSecure Coding Standard for Java?》和《Secure Coding in C and C++, Second Edition》。他发表过60多篇论文,这些论文涉及的领域有:软件安全、基于组件的软件工程、基于 Web 的系统设计、遗留系统升级,组件仓库和搜索引擎,以及用户界面的设计与开发。Robert 自 2005 年起,一直在为私人企业、学术界和政府教授《Secure Coding in C and C++》。他从1982年就在IBM开始了职业编程生涯,主要工作有通信软件和操作系统软件,处理器开发和软件工程。Robert还曾服务于X Consortium,在那儿他开发和维护了Common Desktop Environment和X Window System的代码。他还是卡内基-梅隆大学在C编程语言国际标准化组织ISO/IEC JTC1/SC22/WG14中的代表。Dean F. Sutherland是CERT的高级软件安全工程师,拥有卡内基-梅隆大学软件工程博士学位(2008年获得)。在回归学术界以前,他在Tartan公司做了14年的软件工程师,在Tartan的最后6年主要是以技术委员会的高级成员和技术领导的身份研究编译器底层技术。他是整个公司研发中央最活跃的技术人员,也是Tartan公司设计和推动新的软件开发流程的煽动者。在 Tartan,他管理研发项目,并领导了12人的编译器底层技术团队。Dean同样也是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。
Java编码指南:编写安全可靠程序的75条建议.pdf下载链接:https://max.book118.com/html/2020/1217/7003112052003032.shtm
本书是《Java安全编码标准》一书的扩展,书中把那些不必列入Java安全编码标准但是同样会导致系统不可靠或不安全的Java编码实践整理了出来,并为这些糟糕的实践提供了相应的文档和警告,以及合规解决方案。读者可以将本书作为Java安全方面的工具书,根据自己的需要,找到自己感兴趣的规则进行阅读和理解,或者在实际开发中遇到安全问题时,根据书中列出的大致分类对规则进行索引和阅读,也可以通读全书的所有规则,系统地了解Java安全规则,增强对Java安全特性、语言使用、运行环境特性
目录菜单:
封面,扉页,版权,版权声明,译者简介,序,前言,致谢,作者介绍,第1章 安全,指南1:限制敏感数据的生命周期,指南2:不要在客户端存储未经加密的敏感数据,指南3:为敏感可变类提供不可修改的包装器,指南4:确保安全敏感方法被调用时参数经过验证,指南5:防止任意文件上传,指南6:准确地编码或转义输出,指南7:防止代码注入,指南8:防止XPath注入,指南9:防止LDAP注入,指南10:不要使用clone()方法来复制不可信的方法参数,指南11:不要使用Object.equals()来比较密钥,指南12:不要使用不安全的弱加密算法,指南13:使用散列函数存储密码,指南14:确保SecureRandom准确地选择随机数种子,指南15:不要依赖可以被不可信代码覆盖的方法,指南16:避免授予过多特权,指南17:最小化特权代码,指南18:不要将使用降低安全性检查的方法暴露给不可信代码,指南19:对细粒度的安全定义自定义安全权限,指南20:使用安全管理器创建一个安全的沙盒,指南21:不要让不可信代码误用回调方法的特权,第2章 防备式编程,指南22:最小化变量的作用域,指南23:最小化@SuppressWarnings注解的作用域,指南24:最小化类及其成员的可访问性,指南25:文档化代码的线程安全性,指南26:为方法的结果值提供反馈,指南27:使用多个文件属性识别文件,指南28:不要赋予枚举常量的序号任何特别意义,指南29:注意数字提升行为,指南30:对可变参数的类型做编译时类型检查,指南31:不要把其值在以后版本里可能会发生变化的常量设置为public final,指南32:避免包之间的循环依赖,指南33:使用用户自定义的异常而非宽泛的异常类型,指南34:尽量从系统错误中优雅恢复,指南35:发布接口前请谨慎设计,指南36:编写对垃圾收集机制友好的代码,第3章 可靠性,指南37:不要在子作用域里遮蔽或者掩盖标识符,指南38:不要在一个声明里声明多个变量,指南39:在程序逻辑中用有意义的符号常量代表文字值,指南40:在常量定义中恰当地表示相互之间的关系,指南41:对于返回数组或者集合的方法,用返回一个空数组或者集合来替代返回一个空值,指南42:只在异常的情况下使用异常,指南43:使用try-with-resources语句安全处理可关闭的资源,指南44:不要使用断言来验证不存在的运行时错误,指南45:在条件表达式中,第二个和第三个操作数应使用相同类型,指南46:不要序列化直接指向系统资源的句柄,指南47:更倾向于使用迭代器而不是列举,指南48:对于短生存周期、不常用的对象不要使用直接缓冲区,指南49:从长生存周期容器对象中移除短生存周期对象,第4章 程序的可理解性,指南50:谨慎使用视觉上有误导性的标识符和文字,指南51:避免歧义重载变参方法,指南52:要避免使用带内错误指示器,指南53:不要在条件表达式中进行赋值,指南54:请使用大括号把if、for或while代码体括起来,指南55:不要直接在if、for或while条件语句后面加分号,指南56:在每一个case分支的代码块中加上break语句,指南57:避免不当的计算循环计数器,指南58:使用括号表示操作的优先级,指南59:不要对文件的创建做任何假设,指南60:做浮点运算前把整数转换为浮点数,指南61:确保对象的clone()方法中有调用super.clone(),指南62:保持注释的一致性和可读性,指南63:检测并移除冗余的代码和值,指南64:尽量保证逻辑完备,指南65:避免有歧义的重载或者误导性的重载,第5章 程序员的常见误解,指南66:不要假设使用volatile关键字声明引用可以保证引用所指对象的安全发布,指南67:不要假设sleep()、yield()或getState()方法提供了同步语义,指南68:不要假设对整数做取余运算总是返回正整数,指南69:不要弄混抽象对象的相等性和引用的相等性,指南70:理解按位运算符和逻辑运算符之间的差异,指南71:理解加载字符串时如何做特别字符转义,指南72:不要使用重载的方法来区分运行时类型,指南73:不要弄混引用的不可变性和对象的不可变性,指南74:谨慎使用序列化方法 writeUnshared()和readUnshared(),指南75:不要试图通过把本地引用变量设置为null来帮助垃圾收集器,附录 Android,术语表,参考文献
文本摘要:
PEARSONJAVA?CODING GUIDELINES 75 RECOMMENDATIONS FOR RELIABLE AND SECURE PROGRAMSJava编码指南:编写安全可靠程序的75条建议〔美〕Fred Long Dhruv Mohindra Robert C.Seacord Dean F.Sutherland David Svoboda 著刘先宁 尤青松 译人民邮电出版社北京图书在版编目(CIP)数据Java编码指南:编写安全可靠程序的75条建议/(美)朗(Long,F.)等著;刘先宁,尤青松译.--北京:人民邮电出版社,2015.12书名原文:Java Goding Guidelines:75 Recommendations for Reliable and Secure ProgramsISBN 978-7-115-40371-1Ⅰ.①J… Ⅱ.①朗…②刘…③尤… Ⅲ.①JAVA语言—程序设计—指南 Ⅳ.①TP312-62中国版本图书馆CIP数据核字(2015)第242307号内容提要本书是《Java安全编码标准》一书的扩展,书中把那些不必列入Java安全编码标准但是同样会导致系统不可靠或不安全的Java编码实践整理了出来,并为这些糟糕的实践提供了相应的文档和警告,以及合规解决方案。读者可以将本书作为Java安全方面的工具书,根据自己的需要,找到自己感兴趣的规则进行阅读和理解,或者在实际开发中遇到安全问题时,根据书中列出的大致分类对规则进行索引和阅读,也可以通读全书的所有规则,系统地了解Java安全规则,增强对Java安全特性、语言使用、运行环境特性的理解。本书给出了帮助Java软件工程师设计出高质量的、安全的、可靠的、强盛的、有弹性的、可用性和可维护性高的软件系统的75条编码指南,适合所有Java开发人员阅读,也适合高等院校教师和学生学习和参考。◆著 [美]Fred Long Dhruv Mohindra Robert C.Seacord Dean F.Sutherland David Svoboda译 刘先宁 尤青松责任编辑 杨海玲责任印制 张佳莹 焦志炜◆人民邮电出版社出版发行 北京市丰台区成寿寺路11号邮编 100164 电子邮件 315@ptpress.com.cn网址 http://www.ptpress.com.cn固安县铭成印刷有限公司印刷◆开本:720×960 1/16印张:17.75字数:328千字 2015年12月第1版印数:1-3000册 2015年12月河北第1次印刷著作权合同登记号 图字:01-2013-9195号定价:55.00元读者服务热线:(010)81055410 印装质量热线:(010)81055316反盗版热线:(010)81055315版权声明Authorized translation from the English language edition,entitled Java Coding Guidelines:75 Recommendations for Reliable and Secure Programs,9780321933157 by Fred Long,Dhruv Mohindra,Robert C.Seacord,Dean F.Sutherland,and David Svoboda,published by Pearson Education,Inc.,publishing as Addison-Wesley,Copyright ? 2014 by Pearson Education,Inc.All rights reserved.No part of this book may be reproduced or transmitted in any form or by any means,electronic or mechanical,including photocopying,recording or by any information storage retrieval system,without permission from Pearson Education,Inc.CHINESE SIMPLIFIED language edition published by PEARSON EDUCATION ASIA LTD.and POSTS & TELECOM PRESS Copyright ? 2015.本书中文简体字版由Pearson Education Asia Ltd.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。本书封面贴有Pearson Education(培生教育出版集团)激光防伪标签,无标签者不得销售。版权所有,侵权必究。译者简介刘先宁 ThoughtWorks高级咨询师,长期从事一线软件开发工作,对Java、面向对象、敏捷方法论都有较深理解。其译作还包括《HTML5移动Web开发实践》。尤青松 ThoughtWorks咨询师,在敏捷软件交付团队中担任技术领导人,尤其对Java企业软件开发及其安全编程有较深理解。作为《The CERTOracleSecure Coding Standard for Java?》的一个延伸,本书是非常有价值的,它甚至可以命名为《可靠的 Java 编码指南》(Reliable Java? Coding Guidelines)。这些年来,可靠性和安全性之间的相互影响深深地触动了我。现如今,虽然有各种各样的显式的安全手段(如加密、身份验证等)用以确保系统安全,但是大多数的漏洞都来自于开发中的失误:编码太差或防备不足。当我们说要构建一个可靠的系统时,在很大程度上等同于构建一个安全的系统。系统的安全性将会得益于你对系统可靠性所做的一切,反之亦然。本书强调了这样一个事实:所谓的安全性其实不是一个特性,而是一种针对所有的潜在的不安全因素都予以充分考虑的态度。安全性应该被持续贯穿在每一位软件工程师的设计思索过程中。它的基础是一系列的编码指南。本书最精彩的地方就是这些编码指南背后的微妙之处。例如,“用散列函数存储密码”,这看上去是一件很基础很明显的事情,然而常常有新闻报道说,由于程序员没有考虑到密码的加密而导致重要数据泄露。大量的细节之处成为了安全隐患的藏身之所,这让系统安全变得很棘手。本书充满了处理这些细节的精彩指导。——“Java之父”James A.Gosling前言本书为Java程序员提供了详细的建议。这些Java编码指南的应用将会带来更健壮、更能抵御攻击的系统。这些编码指南覆盖范围广泛,适用于大多数基于Java编写的运行在不同设备上的产品,这些设备包括电脑、游戏机、手机、平板电脑、家用电器和汽车电子设备。不管是哪一门编程语言,开发人员在控制程序结构时都应遵守一系列基于该语言特定规则的指南。Java程序员也理应如此。为了编写安全可靠的Java程序,Java程序员需要很多的帮助,单凭Java语言规范(Java Language Specification,JLS)[JLS 2013]是远远不够的。由于Java包含的许多语言特性和API很容易被误用,因此需要一些必要的避免这些陷阱的指导。对于一个程序来说,可靠意味着在所有场景或所有可能输入条件下均能正常工作。不可避免的是,任何重要的程序都会遇到一些完全意想不到的输入或场景,从而发生错误。当此类错误发生时,最重要的是它产生的影响必须是有限的,而这可以通过快速定位错误并尽快处理它来实现。预期不寻常的输入或编程场景,并采用防备式编程方式,程序员会受益良多。其中一些指南可能被认为是一种编码风格,但对于代码的可读性和可维护性来说,它们仍旧很重要。针对Java语言,Oracle公司提供了一组编码约定[Conventions 2009]来帮助程序员编写具有一致编程风格的代码,这些约定已经被Java程序员广泛采用。《The CERTOracleSecure Coding Standard for Java?》本书由《The CERTOracleSecure Coding Standard for Java?》[Long 2012]一书的作者编写。该编码标准提供了一组针对Java语言的安全编码规则,目的是消除那些可能导致安全隐患的不安全编码实践。该安全编码标准为软件系统建立了规范的需求,同时也可以用来评估软件系统的一致性,例如,使用《Source Code Analysis Laboratory (SCALe)》[Seacord 2012]来检测软件系统的一致性。不过,有些不必列入Java安全编码标准的、糟糕的Java编码实践,也会导致不可靠或不安全的程序。本书针对这样的编码实践提供了相应的文档和警告。虽然这些编码指南没有出现在《The CERTOracleSecure Coding Standard for Java?》[Long 2012]中,但是它们的重要性却不应该被忽视。当一个编码指南不能构成一个规范需求时,是不能被收录到编码标准里的。无法构成规范需求的原因有很多,可能最常见的原因是,规则取决于程序员的意图。这些规则不能自动应用,除非程序员有特定的意图,在这种情况下,代码和特定的意图是需要保持一致的。为了形成一个规范的需求,需要证明的是,倘若不遵守这一需求将会导致代码缺陷。有些编码指南已经被排除在编码标准之外(但包括在本书当中),遵守这些指南进行编码始终是一个好主意,但违背这些指南也并不总是会导致错误的结果。之所以会有这样的区别,是因为倘若该系统没有因此产生特定的缺陷,我们不能说它不合格。因此,编码规则必须有非常严格的定义。而编码指南往往会对安全性和可靠性产生更深远的影响,因为它们可以被更概括地定义。许多指南都参考了《The CERTOracleSecure Coding Standard for Java?》里面的规则。这些引用的形式类似于“IDS01-J. Normalize strings before validating them”,引号中的前三个字母表示的是《The CERTOracleSecure Coding Standard for Java?》一书的相关章节。例如,IDS指的是第2章“Input Validation and Data Sanitization (IDS)”。这些安全编码标准针对Java的详细规则也可在CERT的安全编码百科网站(www.securecoding.cert.org)上找到,在那里它们有持续的更新。《The CERTOracle Secure Coding Standard for Java?》提供了针对一致性测试的定义,但安全编码百科上可能有该书没有涉及的、关于这些定义的扩展信息以及见解,这些可以帮助程序员理解这些规则的意义。本书中对于其他编码指南的交叉引用都只给出了编码指南的编号。范围本书侧重于Java SE 7平台环境,同时针对在安全编码过程中由于使用Java SE 7 API而产生的问题,进行了一些指导。Java语言规范Java SE 7版(The Java Language Specification: Java SE 7 Edition,JLS)[JLS 2013]规定了Java编程语言的行为,本书的这些指南主要是参考它开发出来的。传统编程语言,如C和C++,它们的语言标准里包括了一些未定义的、未指明的以及实现定义的(implementation-defined)行为,这些都容易使程序员对这些行为的可移植性作出不准确的假设,从而导致漏洞。相比之下,Java语言规范更严格地定义了语言行为,因为Java是一种跨平台语言。即便如此,某些行为的自由裁量权还是留给了Java虚拟机(Java Virtual Machine,JVM)的实现者或者Java编译器。这些指南确定出了这种语言的特点,提供了一些可以帮助开发者定位问题的解决方案,让程序员领会和理解语言的局限性并更好地利用它。只关注语言本身并不能编写出可靠安全的软件。有时,Java API中设计有问题的接口会被弃用。其他时候,API或相关文档也有可能被编程社区不准确地解读。这些指南识别出了有可能被曲解的API,并强调了它们的准确用法,常用的、有缺陷的设计模式和编程风格的示例也包括在内。Java语言、其核心API和扩展API以及Java虚拟机提供了一些安全特性,如安全管理器、访问控制器、加密解密、自动内存管理、强类型检查和字节码验证。这些特性可以为大多数应用程序提供足够的安全,但它们的准确使用却是至关重要的。这些指南不仅强调了那些与安全体系结构相关的陷阱和警告,同时强调了它的准确实现。遵守这些指南可以确保被信任程序不出现大量的可利用的安全漏洞,从而避免可能导致的拒绝服务、信息泄露、错误的计算和特权升级。包含的库图P-1是Oracle公司Java SE产品的概念图。图P-1 Oracle公司Java SE产品的概念图(来自Oracle公司的Java SE Documentation, http://docs.oracle.com/javase/7/docs/.Copyright ? 1995,2010,Oracle and/or its affiliates.All rights reserved.)这些编码指南主要适用于基于lang和util的库以及“其他基础库”,解决了其中的安全问题。这些编码指南没有包含那些已经标记为需要修复的公开bug或者那些没有负面影响的问题。某些功能性bug也被包含其中,它们发生频率高,可造成相称大的安全或可靠性问题,或者影响大多数依赖于核心平台的Java技术。这些指南不仅包括特定于核心API的安全问题,还包括重要的有关标准扩展API(javax包)的可靠性和安全性问题。为了掌握Java提供的全方位的安全特性,程序员需要学习通过代码与其他组件和框架进行交互。偶尔,本书中的编码指南使用的示例来自于流行的Web应用程序框架(如Spring和Struts)和流行的技术,如Java服务器页面(Java Server Page,JSP),通过这些示例突出安全漏洞并不是单独存在的。只有当标准API本身没有提供选项来避免漏洞时,第三方库和解决方案才应予以考虑。没有解决的问题这个安全编码标准没有解决的若干问题。内容本书中采用的这些编码指南是广泛适用于几乎所有平台的,那些关注点在单一Java平台上的编码指南(例如,那些Android、Java微小版(ME)或Java企业版(EE)适用但Java标准版(SE)不适用的编码指南)被排除在了本书之外。另外,在Java标准版中,用于处理用户界面(用户界面工具包)或为 Web 界面提供特性(如声音、图像渲染、用户账户访问控制、会话管理、身份验证以及授权)的API,也超出了本指南的范围。尽管如此,书中的这些指南还是讨论了网络化的 Java 系统因不适当的输入验证而带来的相关风险,以及面临的注入式缺陷,并提供了适当的解决方案。另外,书中这些指南已假定产品的功能规范已被准确识别,同时没有来自高层设计和架构的缺陷。编码风格编码风格问题是主观性的,已被证明的是——在编码风格方面是不可能达成共识的。因此,本书通常尽量避免采用任何特定的编码风格。相反,我们建议用户通过这些指南定义自己的编码风格。让编码风格持续一致的最简朴方法就是使用代码格式化工具。许多集成开发环境(IDE)都提供了这样的功能。工具这些指南并不能够自动检测或修正。在某些情况下,工具厂商可以选择实现检查器来确定代码是否违背了这些指南。软件工程研究所(Software Engineering Institute, SEI)作为美国联邦政府资助的研发中央(Federally Funded Research and Development Center,FFRDC),不适合为此推荐特定的供应商或工具。有争议的指南通常,本书会尽量避免包含具有争议的、缺乏广泛共识的指南。目标读者本书主要适用于Java语言程序开发人员。虽然这些指南的重点放在了Java SE 7平台环境上,但对于工作在Java ME、Java EE或其他Java版本平台环境上的程序员们,也具有一定的参考价值(虽然不完全)。尽管这些指南的主要设计目的是构建安全可靠的系统,但这些指南同时也有助于提高系统的其他质量属性,如安全性、可靠性、健壮性、可用性和可维护性。这些指南还适合于:分析工具的开发者,用于诊断出不安全或不合规范的Java语言程序;软件开发经理、软件购买者或其他软件开发专家,用于建立一套严格的安全编码标准;Java编码课程的教育工作者,可作为主教材或辅助教材。内容组织本书的75条编码指南是围绕着以下原则组织的。第1章“安全”介绍了用于确保Java应用程序安全性的编码指南。第2章“防备式编程”包含一些防备式编码指南,通过这些指南,程序员可以编写出防备性的程序。第3章“可靠性”给出了提高Java应用程序可靠性和安全性的建议。第4章“程序的可理解性”给出了让程序更易读易懂的建议。第5章“程序员的常见误解”展示一些Java语言和编程概念常常被误解的情形。附录A描述了本书针对在Android平台上进行Java编程的适用性。本书还包含了常用术语表和参考文献。本书中的指南均有一致的结构。标题和起始段落定义了该指南的本质。紧接着通常是由一个或多个违规代码示例及其相应的合规解决方案。每个指南的最后一个部分均给出了该指南的适用性和详细参考文献。致谢本书得以完成离不开广大社区人员的帮助,首先,要感谢为本书编码指南做过贡献的Ron Bandes、Jose Sandoval Chaverri、Ryan Hall、Fei He、Ryan Hofler、Sam Kaplan、Michael Kross、Christopher Leonavicius、Bocong Liu、Bastian Marquis、Aniket Mokashi、Jonathan、Paulson、Michael Rosenman、Tamir Sen、John Truelove和Matthew Wiethoff。其次,非常感谢为本书的内容提供过帮助的James Ahlborn、Neelkamal Gaharwar、Ankur Goyal、Tim Halloran、Sujay Jain、Pranjal Jumde、Justin Loo、Yitzhak Mandelbaum、Todd Nowacki、Vishal Patel、Justin Pincar、Abhishek Ramani、Brendon Saulsbury、Kirk Sayre、Glenn Stroz、Yozo Toda和Shishir Kumar Yadav。另外,还需要感谢Hiroshi Kumagai和JPCERT对本书的Android附录所做的贡献。感谢本书的审视人员:Thomas Hawtin、Dan Plakosh和Steve Scholnick。感谢SEI和CERT的管理者支持和鼓励我们完成本书,他们是Archie Andrews、Rich Pethia、Greg Shannon和Bill Wilson。感谢本书的编辑Peter Gordon以及他在 Addison-Wesley出版社的团队:Kim Boedigheimer、Jennifer Bortel、John Fuller、Stephane Nakib和Julie Nahil;同样感谢项目编辑Anna Popick和文字编辑Melinda Rankin。感谢CERT团队的其他成员的支持和帮助,没有你们的帮助,本书不可能完成。最后,同样要感谢本书的责任编辑Carol J. Lallier,是她让这本书变成可能。作者介绍Fred Long是英国Aberystwyth大学计算机科学系的高级讲师,主要讲授:形式方法论,Java、C++和 C 语言编程,以及编程相关的安全问题。他还是英国计算机协会中威尔士分会的主席。Fred自1992年起一直担任软件工程研究所(Software Engineering Institute)的客座科学家。最近他的研究内容涉及了Java中的漏洞调查。Fred还是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。Dhruv Mohindra是印度Persistent Systems有限公司CTO办公室下的安全实践小组的技术领导。他为各个领域的公司提供信息安全方面的咨询服务,包括云服务、协作、银行、金融业、电信行业、企业、移动、生命科学和卫生保健领域。他会定期为财富500强、中小企业和创业公司的高级经理和开发团队提供咨询服务,帮助他们在软件开发周期中构建安全,实施最佳信息安全实践。Dhruv曾在软件工程研究院的CERT分部工作,持续推动编程社区的安全意识提升。Dhruv拥有印度Pune大学的本科学位,以及卡内基-梅隆大学的信息安全策略与管理硕士学位。Dhruv同样也是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。Robert C. Seacord是一位安全编码技术经理,就职于宾夕法尼亚州匹兹堡市的卡内基-梅隆软件工程研究院(Software Engineering Institute,SEI)的CERT分部。他还是卡内基-梅隆大学计算机科学与信息网络学院的教授,是《The CERTC Secure Coding Standard》一书的作者,以及下列书籍的合著者:《Building Systems from Commercial Components》《Modernizing Legacy Systems》《The CERTOracleSecure Coding Standard for Java?》和《Secure Coding in C and C++, Second Edition》。他发表过60多篇论文,这些论文涉及的领域有:软件安全、基于组件的软件工程、基于 Web 的系统设计、遗留系统升级,组件仓库和搜索引擎,以及用户界面的设计与开发。Robert 自 2005 年起,一直在为私人企业、学术界和政府教授《Secure Coding in C and C++》。他从1982年就在IBM开始了职业编程生涯,主要工作有通信软件和操作系统软件,处理器开发和软件工程。Robert还曾服务于X Consortium,在那儿他开发和维护了Common Desktop Environment和X Window System的代码。他还是卡内基-梅隆大学在C编程语言国际标准化组织ISO/IEC JTC1/SC22/WG14中的代表。Dean F. Sutherland是CERT的高级软件安全工程师,拥有卡内基-梅隆大学软件工程博士学位(2008年获得)。在回归学术界以前,他在Tartan公司做了14年的软件工程师,在Tartan的最后6年主要是以技术委员会的高级成员和技术领导的身份研究编译器底层技术。他是整个公司研发中央最活跃的技术人员,也是Tartan公司设计和推动新的软件开发流程的煽动者。在 Tartan,他管理研发项目,并领导了12人的编译器底层技术团队。Dean同样也是《The CERTOracleSecure Coding Standard for Java?》一书的合著者。
Java编码指南:编写安全可靠程序的75条建议.pdf下载链接:https://max.book118.com/html/2020/1217/7003112052003032.shtm
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论