程序员常常都会在项目里插入专门的工具,用它们来创建宏、调试代码,或者让编程工作变成更加轻松一些。(使用)这些没有经过验证工具的目的是加速开发和测试。但是计算机编程的历史表明,在代码里留下未经验证的特性就好像是在政府部门里保守秘密——要不了多久,想知道秘密的人都会知道秘密的内容。
未经验证的命令或者特性集有两种类型。第一种是部分实现的命令或者以前遗留下来的命令,它们可能完全无害,但是由于某种原因没有经过用户的验证。而另外一种,这种类型是极其危险的,是跳过所有通常安全限制(或者好的编程实践)的调试或者开发工具,这种类型的工具只用于开发团队。
开发人员加入能够在测试期间保存堆栈和注册内容的工具是完全没有错误的——只要你以后删除它就行了。问题在于,某个程序员在代码里放入了“隐藏的”特性,而又没有告诉开发团队里的其他人,同时没有正确地验证这个特性,或者通过其他的途径让这个未经验证的特性溜进了最终代码里。
要真正地解决这个问题有两种方法:(1)绝对禁止放入任何未经验证的代码,或者(2)专门要求使用这样的特性。任何中间的立场都会最终导致危险命令或者特性留在被部署的代码里。
第一种选择看起来似乎是一种很显而易见的解决办法,用来防止开发人员加入黑客能够找到和利用的未经验证的特性。但是,这种方法没有考虑到在最终期限(的压力)下人类的本性或者创建复杂系统实际方面的问题。任何忽略真实现状的安全措施或者规则都有可能忽略掉更多的东西。
有些项目就是迫切需要宏来创建API,需要专门的命令来加速调试,或者需要其他的捷径来大幅提高开发过程(尤其是在最终阶段)的效率。如果黑客发现并开始利用这些工具,这将是极其危险的。
对于很多项目来说,更好的解决方案其实是在一开始就告知开发团队这些工具的用处,而且它们要被使用到。那么,你可以按照下面的步骤来进行:
你可以在任何应用程序找到没有经过验证的命令;它们一般都会被放在代码里,尤其是在创建植入新设备里的驱动程序或者固件的时候。未经验证的命令集和功能都是极其危险的,必须从最终版本里清除掉,但是它们对于开发人员来说太有用了,因此从一开始就规划好它们的使用和删除是一个聪明的办法。
尽管未经验证的命令在开发过程中非常有用,但是一定要记住:它们对于黑客来说更为有用。