如何应用常见的验证方法:
  自动化运行期测试:通过访问两个不同用户数据的方式,使用一个用户的账号尝试访问另一个用户的数据,自动化工具能够在一定程度上完成本需求的测试。然而,这些工具不可能清楚一个用户账号的哪些数据是敏感的,也不了解把参数“data=account1”修改为“data=account2”表示违反了授权。
  手工运行期测试:通常情况下,手工运行期测试是发现这类漏洞有效的方法,因为人可以拥有必需的领域知识以探明这类攻击的位置。然而,在有些情况下,运行期测试人员可能无法全面掌握发现这类缺陷所必需的一切信息。例如,如果附加一个类似于“admin=true”的隐藏参数,使你可以不需授权检查能访问其他用户的数据。
  自动化静态分析:如果没有规则的定制,自动化工具通常发现不了这种类型的漏洞,因为它需要对领域的理解能力。例如,静态分析工具不清楚“data”参数表示条件信息,需要授权检查。
  手工代码审查:手工代码审查能够揭露缺失授权的实体(译者注,比如代码),这是使用运行期测试难以发现的,比如添加一个“admin=true”的参数的影响。但是,实际上采用这种方式去验证是否做了授权检查费时费力。一处授权检查可能出现在许多不同部分的代码中,所以手工审查人员可能需要从头到尾追踪数条不同的执行路径,以检测是否做了授权。
  对你的影响
  验证的不透明的本质,意味着有效的软件安全需求的管理是必要的。对于已列出的需求,测试人员即可以明确他们已经评估一条具体的需求,也可以明确他们所用到的技术。评论家提出,渗透测试不应该遵循一张“类似于审计的检查表”,因为没有检查表可以覆盖模糊的范围和特定领域的漏洞。但是,要灵活地找到独特的问题,不可避免地要确定已经充分理解了需求。这种情况与标准的软件质量保证(QA)非常相似:好的质保测试人员即能够验证功能需求,也能够思考盒子的边界,想办法去破坏功能。如果只是简单、盲目地测试,报告一些与功能需求无关的缺陷,会显著降低质量保证的效用。那么为什么要接受较低标准的安全测试呢?
  在你执行下一次安全验证活动之前,确保你有软件安全需求可用于衡量,并且你要明确属于验证范围内的需求。如果你雇佣手工渗透测试人员或源代码审查人员,他们可以相对轻松地确定哪些需求是由他们来测试的。如果你使用某种自动化工具或服务,合作的供应商会表明,哪些需求无法用他们的工具或服务可靠地测试。你的测试人员、产品或服务不可能保证完全没有假阴性错误(例如,保证你的应用中不会受到SQL注入攻击),但同时也要理解,对它们做测试能够大大有助于增加你的自信心,有信心你的系统代码中不包含已知的、可预防的安全漏洞。