搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
C安全编码标准
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787111284420
  • 作      者:
    (美)Robert C. Seacord著
  • 出 版 社 :
    机械工业出版社
  • 出版日期:
    2010
收藏
编辑推荐
  一本重要的桌面参考手册,记录了《CERTC安全编码标准》的第一次官方发布
  每一位C程序员的案头必备
  内容新颖,讲解详尽
  实现C安全编程的权威指南
展开
作者简介
  RobertC.Seacord,在位于宾夕法尼亚州匹兹堡市的软件工程协会(SEI)的CERT小组倡导了安全编码活动。除了其他与安全相关的活动,CERT还定期分析软件潜在风险报告,并评估它们对Intemet和其他关键的基础结构的风险。Robea是CarnegieMellon大学计算机科学系和信息网络协会的助理教授,并在Pittsburgh大学兼职。作为一名电子技术专家,Rob.err已经出版了SecureCodeinginCandC++》(Addison.Wesley,2005)、(BuildingSystemfromCommercialcomponents}(Addison-Wesley,2002)和《ModernizingLegacysystems))(Addison-Wesley,2003)3本书,并发表了40余篇有关软件安全、基于组件的软件工程、基于Web的系统设计、遗留系统的现代化、组件仓库、搜索引擎以及用户界面设计和开发的论文。Rob.ert于1982年开始在IBM做一名专业的程序员,致力于通信和操作系统软件开发、处理器开发和软件工程。Robea还在XConsortium工作过,为通用桌面环境和XWindow系统开发和维护代码。他是CarnegieMellon大学在PL22.11(ANSI“C”)的代表,并且是c编程语言的JTCl/SC22/WGl4国际标准化工作组的一位技术专家。
展开
内容介绍
  《C安全编码标准》提供了在C编程语言中进行安全编码的指导方针,描述了C语言程序中导致软件潜在风险根源的编码错误,并根据严重性、被利用的可能性以及修补成本设置了优先级。每个指导方针提供了不安全代码的例子以及安全的替代方案。如果统一应用这些指导方针,可帮助消除导致缓冲区溢出、格式字符串潜在风险、整数溢出和常见的软件潜在风险的关键编码错误,从而创建更健壮的高质量软件系统。
  《C安全编码标准》内容新颖,讲解详尽,可作为软件开发技术人员的参考用书。
  软件安全性对于公司的运作和财富具有很大的影响,与个人的生活也息息相关。为了创建安全的软件,开发人员必须知道什么地方存在危险。C的安全编码要比许多经验丰富的程序员所想像的更为困难。
  《C安全编码标准》是一本重要的桌面参考手册,记录了《CERTC安全编码标准》的第一次官方发布。这个标准逐项描述了C语言程序中导致软件潜在风险根源的编码错误,并根据严重性、被利用的可能性以及修补成本设置了优先级。每个指导方针提供了不安全代码的例子以及安全的替代方案。如果统一应用这些指导方针,可以消除可能导致缓冲区溢出、格式字符串潜在风险、整数溢出和常见的软件潜在风险的关键编码错误。
展开
精彩书评
  “我是CERT安全编码活动的热情支持者。程序员可以找到关于正确性、清晰性、可维护性、性能等方面的很多建议,但对于特定的语言特性如何影响安全性方式的建议则明显缺乏。本书填补了这个空白。”
  ——RandyMeyers,ANSIC主席
  “在过去的几年里,我们依赖于CERT/CC公布各种建议,它们记录了无尽的安全问题。现在,CERT已经汇集了前沿技术专家的建议,向程序员和项目经理提供了实用的指导方针,避免在新的应用程序中出现这些问题,并帮助实现安全的遗留系统。干得好!”
  ——ThomasPlum,PlumHall,Inc.创始人
  “互联网的存在极大地增加了对安全、防黑客应用程序的需要。通过组合这个CERT标准和其他安全指导方针,顾客可以获得全面的保护以及创建零缺陷软件的方法。”
  ——ChrisTapp,领域应用程序工程师,LDRALtd
  “我觉得这个标准是无可代替的,它汇集了许多专家信息,让我们了解现代的软件系统在实践中是如何失败的。它是创建一个国际安全编码指导方针的良好起点。其他地方找不到这样的信息。就软件安全这个问题而言,你不知道的东西常常会给你带来伤害。”
  ——JohnMcDonald,《TheArtofSoftwareSecurityAssessment》的作者之一
展开
精彩书摘
  本标准中的规则可以用特定组织的规则进行扩展,但是后者必须遵循本标准中的规则,以实现与本标准的顺应性。
  软件专业人员可以通过培训,理解如何正确地应用安全编码标准。通过考试,这些经过培训的程序员可以认证为安全编码专业人员。
  当一种安全编码标准确立之后,可以开发或修改一些工具,以确定与标准的顺应性。编码实践中的某个条件是否可以看成是规则取决于是否可以验证它的顺应性。验证可以手工进行,也可以用自动化工具完成。手工验证不仅需要很大的工作量,而且很容易出错。工具验证也存在问题,由于可能存在回归错误,所以静态分析工具检测规则的所有偏离的能力必须在每个产品发布中都得到证明。即使面临这些挑战,自动化验证仍然是经济上惟一可行的用于验证编码标准顺应性的解决方案。
  软件分析工具可以认证为能够验证与这个安全编码标准的顺应性。顺应性软件系统可以由一个得到适当授权的认证机构通过使用认证工具认证为是顺应性的。系统质量
  安全性是在选择和应用编码标准时必须考虑的系统属性之一。其他需要考虑的属性还有可移植性、可靠性、可用性、可维护性、可读性和性能等。
  在这些属性中,有许多属性以有趣的方式相互关联。例如,可读性是可维护性的一个属性,它们对于在维护时防止产生可能导致安全漏洞或可靠性问题的缺陷是极为重要的。另外,可读性有助于提高代码的检查效率。可靠性和可用性都要求适当的资源管理,与系统的安全密切相关。像性能和安全这样的系统属性常常存在冲突,需要考虑两者之间的权衡。
  这个安全编码标准的目的是提高软件的安全性。但是,由于安全性和其他系统属性之间的关系,主要针对其他系统属性的建议对于系统的安全性往往也具有重要的意义。
展开
目录
关于作者
前言
第1章 本标准使用说明
系统质量一
自动生成的代码
顺应性

第2章 预处理器(PRE)
建议和规则
风险评估汇总
相关规则和建议
PRE00-C.用内联函数或静态函数代替与函数相似的宏
PRE01-C.在宏参数名两边加上括号
PRE02-C.宏替换列表应该加上括号
PRE03-C.应该使用typedef定义编码类型
PRE04-C.不要复用标准头文件名
PRE05-C.理解连接标记或执行字符串化时的宏替换
PRE06-C.把头文件放在包含防护条件中
PRE07-C.避免使用连续的问号
PRE08-C.保证头文件名惟
PRE09-C.不要用不安全的函数替换安全函数
PRE10-C.在一个do-while循环中包装多条语句的宏
PRE30-C.不要通过连接创建统一字符名称一
PRE31-C.不要在不安全宏的参数中包含赋值、增值、减值、volatile访问或函数调用

第3章 声明和初始化(DCL)
建议和规则
风险评估汇总
DcL00-C.用const限定不可修改的对象
DcL01-C.不要在子作用域中复用变量名
DcL02-C.使用视觉区别明显的标识符
DcL03-C.使用静态断言测试常量表达式的值
DcL04-C.不要在一个声明中声明超过1个的变量
DCID5-C.使用typedef。声明提高代码的可读性
DCI06-C.使用有意义的符号常量表示程序逻辑中的字面值
DCI07-C.在函数声明器中包含适当的类型信息
DCID8-C.在常量定义中对关系进行正确的编码
DCI09-C.把返回errno错误代码的函数的返回类型声明为errmo-t
DCL10-C.维护变参函数的编写者和调用者之间的契约
DCL11-C.理解与变参函数相关联的类型问题
DCL12-C.使用不透明类型实现抽象数据类型
DCL13-C.把不会被函数修改的值指针参数声明为const
DCL-14.不要对跨翻译单元的全局变量的初始化顺序作出假设
DCL15-C.把不需要外部链接的对象声明为static
DCL30-C.声明具有正确存储持久期的对象
DCL31-C.在使用标识符之前声明它们
DCL32-C.保证相互可见的标识符是惟一的
DCL33-C.保证函数实参中具有限制性限定的源指针和目标指针不引用重叠的对象
DCL34-C.对无法缓存的数据使用volatile
DCL35-C.不要使用与函数定义不匹配的类型转换函数DC136-C.不要声明具有冲突链接属性的标识符

第4章 表达式(EXP)
建议和规则
风险评估汇总
相关的规则和建议
EXP00-C.使用括号保证操作的优先级
EXP01-C.不要用指针的长度确定它所指向类型的长度
EXP02-C.注意逻辑AND和OR操作符的短路行为
EXP03-C.不要认为结构的长度等于它的各个成员的长度之和·
EXP04-C.不要在结构之间执行逐字节的比较
EXP05-C.不要转换掉eonst限定
EXP06-C.sizeof操作符的操作数不应该包含副作用
EXP07-C.不要在表达式中对常量的值作出假设而削弱常量的优点
EXP08-C.确保正确地使用指针运算
EXP09-C.使用sizeof确定类型或变量的长度
EXP10-C.不要依赖子表达式的求值顺序或副作用的发生顺序
EXP11-C.不要把期待一种类型的操作符应用于一种不兼容的类型
EXP12-C.不要忽略函数的返回值
EXP30-C.不要依赖序列点之间的求值顺序
EXP31-C.避免断言的副作用
EXP32-C.不要转换掉volatile限定
EXP33-C.不要引用未初始化的内存
EXP34-C.保证不对null指针进行解引用
EXP35-C.不要在后续的序列点之后访问或
修改一个函数的调用结果中的数组
EXP36-C.不要把指针转换为对齐要求更严格的指针类型
EXP37-C.调用函数时使用API所指定的参数
EXP38-C.不要在位段成员或非法类型上调用offsetof()

第5章 整数(INT)
建议和规则
风险评估汇总
相关的规则和建议
INT00-C.理解编译器所使用的数据模型
INT01-C.使用rsize-t或size-t类型表示所有表示对象长度的整数值
INT02-C.理解整数转换规则
INT03-C.使用安全的整数库
INT04-C.对来自不信任来源的整数值实行限制
INT05-C.如果输入函数无法处理所有可能出现的错误就不要用它们转换字符数据
INT06-C.使用strtol()或相关函数把字符串标记转换为整数
INT07-C.只使用显式的有符号或无符号char类型表示数值
INT08-C.验证所有的整数值位于范围内
INT09-C.保证枚举常量映射到惟的值
INT10-C.使用%操作符时不要假设余数总是正的
INT11-C.把指针转换为整数或者把整数转换为指针时需要小心
INT12-C.当普通的整数位段用于表达式不要对它的类型作出假设
INT13-C.只对无符号操作数使用位操作符
INT14-C.避免在同一个数据上执行位操作和算术运算
INT15-C.在程序员定义的整数类型的格式化L/O中使用intmax-t或uintmax-t
INT30-C.保证无符号整数运算不产生回绕
INT31-C.保证整型转换不会丢失或错误解第数据
INT32-C.保证有符号整数运算不会产生溢出
INT33-C.保证除法和求模运算不会导致除零错误
INT34-C.移位的数量不能是负数或大于操作数的位数
INT35-C.把整型表达式比较或赋值为一种较大类型之前用这种较大类型对它进行求值

第6章 浮点数(FCP)
建议和规则
风险评估汇总
相关规则和建议
FLP00-C.理解浮点数的限制
FLP01-C.在重新排列浮点表达式时需要注意
FLP02-C.需要精确计算时避免使用浮点数
FLP03-C.检测和处理浮点错误
FLP30-C.不要使用浮点数作为循环计数器
FLP31-C.不要用复数调用期望接受实数的函数
FLP32-C.防止或检测数学函数中的定义域错误和值域错误
FLP33-C.执行浮点运算时把整数转换为浮点数
FLP34-C.保证浮点转换位于新类型的范围之内

第7章 数组(ARR)
建议和规则
风险评估汇总
相关规则和建议
ARR00-C.理解数组的工作方式
ARR01-C.获取数组的长度时不要对指针应用sizeof操作符
ARR02-C.显式地指定数组的边界,即使它已经由初始化佰列表隐式地指定
ARR30-C.保证数组索引位于合法的范围之内
ARR31-C.在所有源文件中使用一致的数组记法
ARR32-C.保证变长数组的长度参数位于合法范围之内
ARR33-C.保证复制的目标具有足够的存储空间
ARR34-C.保证表达式中的数组类型是兼容的
ARR35-C.不允许循环迭代到数组尾部之后
ARR36-C.不要对两个并不指向同一个数组的指针进行相减或比较
ARR37-C.不要把一个指向非数组对象的指针加上或减去一个整数
ARR38-C.如果结果值并不引用合法的数组元素,不要把指针加上或减去一个整数

第8章 字符和字符串(STR)
建议和规则
风险评估汇总
相关规则和建议
STR00-C.使用适合的类型表示字符
STR01-C.采纳和实现一致的字符串管理计划
STR02-C.对传递给复杂子系统的字符串数据进行净化
sTR03-C.不要意外地截断null结尾的字节字符串
sTR04-C.使用普通char类型表示基本字符集中的字符
STR05-C.引用字符串常量时使用const指针
STR06-C.不要以为stl"tok()会使解析的字符串不被修改
STR07-C.使用TR2473l修正现在的字符串操纵代码
STR08-C.使用托管字符串开发新的字符串操纵代码
STR30-C.不要试图修改字符串常量
STR31-C.保证字符串的存储具有足够的空间容纳字符数据和null结尾符
STR32-C.根据需要将字符串用null结尾
STR33-C.正确地判断宽字符串的长度
STR34-C.在转换为更大的整型长度时把字符转换为无符号类型
STR35-C.不要把未检查边界来源的数据复制到固定长度的数组
STR36-C.不要指定用字符串常量初始化的字符数组的边界
STR37-C.字符处理函数的参数必须能够用unsignedchar表示

第9章 内存管理(MEM)
建议和规则
风险评估汇总
相关规则和建议
MEM00-C.在同一个模块、同一个抽象层中分配和释放内存
MEM01-C.在free()之后立即在指针中存储一个新值
MEM02-C.把内存分配函数的调用结果立即转换为指向被分配类型的指针
MEM03-C.及时清除存储在可复用资源中的敏感信息
MEM04-C.不要执行零长度的分配
MEM05-C.避免大型的堆栈分配
MEM06-C.保证敏感数据不会被写入到磁盘
MEM07-C.保证calloc()的参数相乘后可以用size-t表示
MEM08-C.只把realloc()用于改变动态分配数组的大小
MEM09-C.不要假设内存分配函数会对内存进行初始化
MEM10-C.定义和使用指针验证函数
MEM30-C.不要访问已经被释放的内存
MEM31-C.动态分配的内存只应释放一次
MEM32-C.检测和处理内存分配错误
MEM33-C.使用正确的语法表示灵活数组成员
MEM34-C.只释放动态分配的内存
MEM35-C.为对象分配足够的内存

第10章 输入/输出(FL0)
建议和规则
风险评估汇总
相关规则和建议
FI000-C.在创建格式字符串时应该小心
F1001-C.调用通过文件名标识文件的函数时必须小心
F1002-C.对来自不信任来源的路径名进行标准化
FI003-C.不要对。fopen()和文件的创建作出假设
FI004-C.检测和处理输入和输出错误
FI005-C.使用多个文件属性标识文件
FI006-C.创建具有正确访问权限的文件
FI007-C.用fseek()代替rewind()
FI008-C.在打开的文件上调用:remove()时应该小心
FI009-C.跨系统传输二进制数据时应该小心
FI010-C.使用rename()函数时应该小心
FI011-C.指定fopen()的mode参数时应该小心
FI012-C.使用setvbuf()代替setbuf()
FI013-C.不要压回多于1个的字符
FI014-C.理解文件流的文本模式和二进制模式的区别
F1015-C.保证文件操作在安全目录中执行
F1016-C.通过创建jail限制对文件的访问
F1030-C.排除格式字符串中的用户
……
第11章 环境
第12章 信号
第13章 错误处理
第14章 其他
附录
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证