15.2.5 软件错误

购买的、免费获取的或编写的软件都可能包含严重的错误。由于网络项目的开发周期通常都很短,那么该软件就很有可能会存在一些错误。任何高度依赖于计算机程序的企业都可能遭受到软件错误的攻击。

软件中的错误可能导致许多无法预见的行为,其中包括服务无效、安全缺口、经济损失和服务质量低下。

我们可以发现,导致这些错误的原因一般都包括低质量的设计说明书、开发人员做出的不完善假设和不充分的测试。

1.低质量的设计说明书

设计文档越简单或者越模糊,最终产品就越有可能出错。尽管对我们而言,在顾客的信用卡被拒绝的时候,特定订单的产品不应该发送给顾客——这个逻辑有些多余,然而对一个大预算的网站不应该出现这样的错误。开发人员对他们所使用系统的经验越少,设计说明书就应该越详细明确。

2.开发人员做出的假设

系统的设计人员和程序员需要做出许多假设。如果可能的话,他们要将这些假设记录到文档中,并且应该保证这些假设都是正确的。但是有些时候,人们做出的假设却非常糟糕。这些假设可能包括输入数据都是有效的,不包含不经常用到的字符,或者输入数据会小于一个特定的长度。此外,还可能包括关于计算时间的假设,例如两个互相冲突的操作在同一时刻出现的可能性或者一个复杂的任务经常比一个简单的任务耗时多。

这类假设很可能会被我们所忽略,因为在大多数情况下它们都是正确的。一个入侵者可能利用缓冲区溢出的问题,因为程序员假定输入数据不会超过某个长度;或者合法用户可能获得让人混淆的错误信息而离开,因为系统开发人员没有见过一个人的名字中会包含有省略号。这类错误可以通过充分的测试与仔细的代码检查找出来并进行改正。

从历史的角度看,入侵者找出来的操作系统级别或应用程序级别的弱点通常与缓冲区溢出或者竞争条件有关。

3.不充分的测试

在所有可能的硬件类型上,运行所有可能的操作系统以及所有可能的用户设置的条件下,测试所有可能的输入条件几乎是不可能的。基于网络的系统更是如此。

我们需要的是经过精密设计的测试计划,在一个有代表性的常见机器类型上测试软件的所有功能。一个规划得很好的系列测试应该把目标制定在对项目中的每行代码,应该保证至少测试一次。理想情况下,这套测试应该自动执行,以便它可以在特定的测试机器上运行而不要花费很多周折。

测试的最大问题是它非常单调并且具有重复性。尽管有一些人喜欢打破规则,但是没有人喜欢一次又一次地打破同样的规则。让原始开发人员之外的人进行测试是非常重要的。测试的一个重要目标就是检查出开发人员所作的不完善假设。一个局外人更可能作出不同的假设。除此之外,专家们也很难非常专注地查找自己工作中的毛病。