但是,安全测试则超出上述内容,它需要理解问题域并精心构造恶意输入。例如,罗马数字算法中不易处理的一类输入是由许多9和4组成的数字(比如,9494949494)。因为它需要递归或参考前一个罗马数字,这可能在软件中导致深堆栈或内存使用过量。这不仅仅是个边界条件。如果我们在功能测试基础上进行安全测试,则需要增加大量测试用例。这意味着必须做两件事来使之便于管理:缩小我们关注的重点以及自动化。

  所有熟悉系统软件测试的人都理解边界值和等价类划分的概念。不必牵涉到太深的标准测试著作,让我们重新回顾一下这两点,因为我们的许多Web安全测试将遵循同样的模型。如果你已经熟悉这些测试中的过程,你会发现很容易能够利用它们来组织你的安全测试。

  边界值

  边界值获取给定的输入并非常仔细地围绕着它能接受的边界值进行测试。例如,如果输入允许使用从0到100(包含0和100)的整数来表示百分比,那么我们可以生成下列边界值:-1,0,1,37,99,100,101。为了生成边界案例,我们重点关注给定范围中大和小的两个值(0和100)。对每个边界,我们使用边界值本身,边界值减1和边界值加1。另外,我们选择一些位于中间的值,这些值的结果应该非常好。这是个基准案例。

  等价类

  在试图找出反面测试值时,我们知道不可接受的输入的集合是一个无限集。作为一种战略,我们从中抽样,而不是试图去测试大量的输入。我们将无限的集合拆分成有一些共同之处的组??等价类,然后我们从每个组中选出几个具有代表性的样品。

  继续考虑“边界值”一节中的例子,我们需要选出几种非法输入类并进行试验。我们可以选择这样的类:负数、非常大的正数、字母组成的字符串、小数以及一些有意义的特殊值,比如MAXINT。通常,我们会从每个类中挑选出少量的数值(比如两个)并将其添加到我们的测试输入集。

  安全类

  “边界值”一节中的7个边界值,以及从“等价类”一节中大约9种等价类中每一种挑选两个值,将反面数据测试用例集合从无限多减少到25个。这是个很好的开始。现在我们开始基于常见攻击和漏洞添加安全测试用例。这是如何将安全测试变为日常功能测试中简单而普通的一部分。我们选择具有安全意义的特殊边界值,以及具有安全意义的特殊等价类值,并将这些融入到我们的测试规划和测试策略过程中。

  有几种得到普遍认可的安全输入类:SQL注入字符串,跨站式脚本字符串以及其他类的编码形式(分别在5.8节,12.1节和第4章予以讨论)。例如,为了绕过某些应用的输入验证程序,你可以使用Base-64或URL方式将某些攻击字符串编码。现在,不同于边界值和其他等价类,这些安全类实际上是无限多的。因此,我们再次战略性地对其抽样,使其成为易于处理的集合。编码而言,我们可以选择3或4种编码。这会使我们的测试集合增加到3或4倍,将25个值变为75或100个值。有些其他办法,系统进行某种编码时或者失败,或者成功。如果在你使用URL方法编码-1时系统失败了,那么它很可能也会在你使用URL方法编码101时失败。因此,你或许可以选择使用Base-64来编码一些值,URL来编码其他值,HTML来编码其他值,并对其他一些值进行多重编码。这样,你能够覆盖这些编码,而且不必将测试用例数量增加到4倍。或许这个数量只倍增到50个测试用例。

  现在,SQL注入和跨站式脚本的攻击字符串交给你了。你必须进行一些判断,并选择一个你能够在自己所拥有的时间内完成的合理的子集。如果你所测试的系统部分易于自动化,那么你可以在每个类中完成许多的测试用例。如果你在进行手动测试,那么你或许应当获取一个不同攻击字符串的长列表,并在每次进行测试时尝试不同的字符串。这样,尽管你没有在每次测试运行时都测试每一条字符串,但是终你将完成大量不同的案例。