当前位置:编程学习 > 网站相关 >>

[译]CERT Secure Coding Standard — C语言安全编程规范(5)

写在最后的话

规范很精彩,评论更精彩。很多建议和规则虽然本身写的有瑕疵,但是当你看了建议/规则页的评论之后,你会发现你并不是第一个提问的人。很多时候你的疑问和疑惑别人已经给你解答了。在我看来,CERT的这个C语言安全编程规范的最重要的意义不是告诉你怎样使用C语言编写一个“无漏洞”的系统,重要的是通过阅读这个规范,你会知道怎样使用C语言会编写出一个“有漏洞”的系统。和很多安全编程规范一样,《CERT Secure Coding Standard》不是要告诉你”What to do”,而是让你知道”What is bad”。

《CERT Secure Coding Standard》中有很多建议/规则都是面向“可移植”代码需求写的,对于确定性的运行在某一个专有平台上,没有代码可移植性需求的C程序员来说,要特别留意不同平台上的一些比较tricky的情况。虽然代码并不总是跨平台的,但程序员却有很大可能性跨平台的。一旦养成了某个平台上的一些“思维惯性”和“经验假设”,写出来的代码跑到另一个平台上时就会出现“可移植性”代码相关的安全漏洞了。

《CERT Secure Coding Standard》通篇都在引经据典,围绕C99、C1X、IEEE等等标准来提建议,定规则。一方面,可以看出建议和规则的制订者们非常重视科学的态度和权威的影响;另一方面,我在翻译的时候得到的一点小小的体会。看过RFC文档的人都知道,RFC标准里关于标准的需求强烈程度专门有一个RFC——RFC 2119来定义”MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 和”OPTIONAL”。通过使用不同的“情态动词”来让标准的阅读者更好的理解哪些是“强制要求”,哪些是“一般性要求”。虽然《CERT Secure Coding Standard》中很多规则/建议都只是使用Do not …来开头,实际上每一条规则/建议都有一个“打分”——Risk Assessment,我在翻译的时候没有把这些“打分”包含进来,主要还是blog排版的问题,谁让我从一开始用的是表格这种形式呢。如果每条规则/建议后面都附上“打分”,可能可读性会更强一些吧。这对我们在制订自己的编程规范时也是一个很好的学习范例,不仅可以通过“情态动词”这种方式,采用量化得分的形式也可以有效的提高标准的“可读性”。

原计划是在春节期间分5天连载完所有的译稿,计划赶不上变化,明天不能上网,索性今天就全部发布完结。我不是英语专业出身,也不通“信、达、雅”,我只是从一个C语言使用者的角度,尽可能用自己的话把建议和规则都说清楚。水平有限,欢迎拍砖。

49. 杂项

规则/建议条目全称 例外 笔记 /备注/点评
MSC00-C. 使用高警告等级编译代码 MSC00-EX1: 编译器会提供诊断信息以帮助改正代码。但有时代码确实正确,但编译器仍然产生警告,可以通过编译器支持的格式化注释方法或其他编译器指令消除警告,或通过注释明确指出相关代码的警告信息为何可以被安全的忽略。
MSC01-C. 尽可能实现逻辑完备性 很多软件漏洞都是由于程序员没有考虑所有可能的逻辑状态而引起的,例如缺少缺省处理逻辑或缺省错误处理逻辑等。
MSC02-C. 避免粗心遗漏造成的错误 该条建议已经被以下3条建议代替:

  • EXP16-C. 禁止将函数指针和常量进行比较
  • EXP17-C. 禁止在条件语句中使用按位运算符
  • EXP18-C. 禁止在选择语句中使用赋值操作
MSC03-C. 避免粗心画蛇添足造成的错误 该条建议已经被以下2条建议代替:

  • EXP15-C. 禁止在if, for, while语句的同一行上写分号
  • MSC12-C. 检测并删除无效代码
MSC04-C. 注释风格统一且可读性高
MSC05-C. 禁止直接操作time_t类型数据
MSC06-C. 操作敏感数据时小心编译器的优化 优化的结果可能是代码的屏蔽执行、常量化或者缓存等,可以使用编译器支持的指令禁止某段代码的自动优化,或者使用一些不会被优化的API。
MSC07-C. 检测并删除死代码 死代码指的是逻辑上永远不会被执行到的代码。
MSC09-C. 字符集编码——使用ASCII字符的子集以保证安全 屏蔽掉一些可能会引起异常或冲突的“元字符”,例如文件名命名中的一些禁用字符。
MSC10-C. 字符集编码——UTF8相关问题 UTF-8是Unicode的变长编码方式。UTF-8根据要表示的Unicode符号,会使用1~4字节来表示一个字符。在实际使用UTF-8字符集时要注意检查UTF-8字节序列的合法性,特别是大部分的Unicode系
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,